【问题标题】:File Directory and autoloading issue PHP MVC文件目录和自动加载问题 PHP MVC
【发布时间】:2014-04-11 07:36:44
【问题描述】:

我正在构建一个 MVC PHP 框架,但在自动加载我的类时遇到了一些问题,我认为这可能与我的文件结构有关。

首先,这是我的文件结构:

我在 Xampp 本地服务器环境中测试开发,所以这就是我拥有私有和公用文件夹的原因。最终在实时服务器上,私有文件夹将位于服务器根目录中,而公用文件夹将位于 public_html 目录中。

我的文件结构看起来是否正确?在私有的前端文件夹中,我所有不同的模块都在目录中,而这些目录又包含一个控制器、模型、视图文件,这些文件包含每个模块的必要文件。

到目前为止,我已经创建了这个自动加载器:

    //Require config and router classes
require_once('router.class.php');
require_once('config.php');

spl_autoload_register(null, false);

spl_autoload_extensions('.class.php');

function autoloader_core($class){
    $filename = strtolower($class) . '.class.php';

    if(!file_exists($filename)){
        echo $filename . " not found";
    }
    include $filename;
}

function autoloader_app($class){
    $filename = strtolower($class) . '.class.php';
    $file = 'C:\xampp\htdocs\simplebids\simplebidsprivate\app/' . $filename;

    if(!file_exists($file)){
        echo $file . " not found";
    }
    include $file;
}

spl_autoload_register('autoloader_core');
spl_autoload_register('autoloader_app');

$router = new test;
$router->say_hello();

这非常适合 lib->core 目录中的类,但是当我尝试实例化一个新的测试类时,我得到了各种关于在 lib->core 文件中找不到 test.class.php 文件的错误,显然不是,但我认为自动加载器功能会在我自己在“autoloader_app”函数中定义的路径中查找。

有趣的是,即使我得到了所有这些错误,我在测试函数 say_hello() 中回显的字符串确实在错误之后得到回显。

所以简而言之,根据错误没有找到文件,但这是因为我可以看到我让类函数打印的回声。

有什么想法吗?

还有我的前端模块文件结构,这是否会使自动加载变得非常困难,因为每个模块以及其中的每个控制器/模型/视图文件都需要不同的自动加载功能?我需要为每个模块提供单独的自动加载功能吗?如果没有,我会怎么做?

谢谢 汤姆

【问题讨论】:

  • 你的配置文件在哪里。另外,尝试添加插件功能。如果您希望发布该框架以供公众使用,则在稍后阶段将需要这样做
  • 没有真正回答您的特定问题,但在自动加载方面您确实应该查看 PSR-0(也许还有 PSR-4)。如果你这样做了,那么你将能够将其他符合 PSR 的框架词混合并匹配到你的框架中(反之亦然)。 php-fig.org/psr/psr-0
  • 你应该开始使用命名空间(PSR-0 会给你一些从哪里开始的方向).. 并且停止在你的文件名中使用.class,因为不是所有你加载的东西都是类。
  • 这可能会有所帮助:stackoverflow.com/questions/5280347/…

标签: php autoloader spl-autoload-register file-structure


【解决方案1】:

我建议采用以下方法。这是我在自己的项目中使用的(包括 MVC 框架)

首先,请遵守以下规则:

  • 每个文件一个类/特征/接口。
  • 使用小写的类/特征/接口名称作为文件名。例如。 Foo 类将是“foo.php”
  • 将命名空间的类/特征/接口文件存储在与命名空间匹配的目录树中,使用小写名称。例如类 \Foo\Bar\Baz 将是“/foo/bar/baz.php”

然后,激活你见过的最简单的自动加载:

将包含所有类文件/目录的director(y/ies)添加到php包含路径:

set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . "/lib");

加载内置自动加载器:

spl_autoload_register('spl_autoload', false);

举个例子,这是我的应用程序常用的目录结构:

Project Root/
|-apptopnamespace/
| |-controllers/
| | |-dashboard.php
| | |-users.php   
| |-models/
| | |-user.php   
| | |-item.php   
| |-etc/
| |-appname.php
| |-router.php
|-bootstrap.php

为了简化它,该框架提供了一种方法来设置自动加载、包含路径等内容。

因此,在bootstrap.php 中进行了以下调用。参数可以很容易地在数组中包含更多路径(例如,[__DIR__, __DIR__ . DIRECTORY_SEPARATOR . 'lib'],如果项目文件夹中有嵌套的“lib”目录):

Bamboo::configure([__DIR__]);

然后(除其他外)在框架内部调用这两个方法:

/**
 * Add one or more paths to the include path
 *
 * @param array $paths an array of paths to add to the include path
 */
protected static function addIncludePath(array $paths) {
    set_include_path(
        get_include_path() . PATH_SEPARATOR . implode(
            PATH_SEPARATOR,
            $paths
        )
    );
}

/**
 * Register the SPL Autoloader
 */
protected static function setupAutoload() {
    // Don't clobber any __autoload already defined
    if (function_exists('__autoload')) {
        spl_autoload_register('__autoload', false);
    }

    spl_autoload_register('spl_autoload', false);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2012-03-21
    相关资源
    最近更新 更多