0

这是我当前的自动加载器:

function classAutoLoad($class) {
    if (file_exists($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/$class.class.php"))
        include($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/".$class.".class.php");
}

spl_autoload_register('classAutoload');

用法:

$class = new Classname;

基本上它将加载 /class/ 中的所有类,不包括目录。我想做的是,更干净。

我有很多类,我想将它们打包到目录中。

如何在此处启用对软件包的支持?或者有一个流行的图书馆吗?

4

3 回答 3

1

您必须想出一些将类名映射到文件的方法。您可以通过维护关联数组来显式执行此操作,也可以使用诸如PSR-0 之类的约定。PSR-0 声明命名空间应转换为$class传递给自动加载器的目录,因此您可以将命名空间分隔符替换为\系统的目录分隔符。

于 2013-06-30T09:11:32.967 回答
0

您的代码似乎更适合您正在尝试做的事情,加载到一个特定的目录中。if (file_exists(...)) { ... }但是,如果文件不存在,我会更改以触发错误。就像是

if (file_exists(...)) {
    ...
} else {
    throw new RuntimeException($class . ' could not be found.');
}

您可以查看Loader.php,它是我使用的自动加载器脚本。这考虑了命名空间,并且可以修改为仅查看*.class.php.

要使用它:

require_once($_SERVER['DOCUMENT_ROOT']."/path/to/Utilities/Loader.php");
\Utilities\Loader::register();

$class = \Namespace\ClassName();
于 2013-06-30T09:12:20.187 回答
0

如果自动加载器不必是完全动态的,您可以简单地使用PHP Autoload Builder。它会扫描您的整个目录并自动创建一个静态类到文件名的映射,大致如下所示:

spl_autoload_register(function($class) {
    static $classes = null;
    if ($classes === null) {
        $classes = array(
            'my\\first\\class' => 'My/First/Class.php',
            'my\\secondclass' => 'My/SecondClass.php'
        );
    }
    $cn = strtolower($class);
    if (isset($classes[$cn])) {
        require __DIR__ . $classes[$cn];
    }
});

优点:

  • 快速而强大
  • 灵活性(基本上,您可以使用任何您喜欢的命名约定)

缺点:

  • 每次添加、删除或重命名类时都需要重新运行。
于 2013-06-30T10:04:24.490 回答