这是我当前的自动加载器:
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 /中的所有类,不包括目录。 我想做的是,更干净。
我有很多课程,我想将它们打包成目录。
如何在此处启用对包的支持?或者有一个受欢迎的图书馆吗?
答案 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];
}
});
优点:
缺点: