PHP自动加载类与目录?

时间:2013-06-30 08:50:13

标签: php oop

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

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 /中的所有类,不包括目录。 我想做的是,更干净。

我有很多课程,我想将它们打包成目录。

如何在此处启用对包的支持?或者有一个受欢迎的图书馆吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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();

答案 2 :(得分: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];
    }
});

优点:

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

缺点:

  • 每次添加,删除或重命名课程时都需要重新运行。