4

我正在构建一个 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() 中回显的字符串确实在错误之后得到回显。

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

任何想法为什么?

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

谢谢汤姆

4

1 回答 1

1

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

首先,遵循以下规则:

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

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

将包含所有类文件/目录的目录(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);
}
于 2014-12-01T11:02:34.867 回答