PHP自动加载带有目录的类?
这是我当前的自动加载器:PHP自动加载带有目录的类?,php,oop,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_re
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/中的所有类,不包括目录。
我想做的是,更干净
我有很多类,我想把它们打包到目录中
如何在此处启用对软件包的支持?或者有一个流行的类库吗?您必须想出一些方法将类名映射到文件。您可以通过维护关联数组来显式地实现这一点,也可以使用类似的约定。PSR-0声明名称空间应该转换为传递给自动加载程序的
$class
中的目录,这样您就可以用系统的目录分隔符替换名称空间分隔符\
。您的代码似乎更适合您尝试执行的操作,加载到一个特定的目录中。但是,如果(file_exists(…){…},我将更改,以在文件不存在时触发错误。差不多
if (file_exists(...)) {
...
} else {
throw new RuntimeException($class . ' could not be found.');
}
您可以查看我使用的自动加载脚本。这将考虑名称空间,并且可以修改为仅查看*.class.php
要使用它:
require_once($_SERVER['DOCUMENT_ROOT']."/path/to/Utilities/Loader.php");
\Utilities\Loader::register();
$class = \Namespace\ClassName();
如果自动加载器不必是完全动态的,您可以简单地使用。它扫描整个目录并自动创建静态类到文件名的映射,大致如下所示:
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];
}
});
优点:
- 快速而健壮
- 灵活性(基本上,您可以使用任何喜欢的命名约定)
缺点:
- 每次添加、删除或重命名类时都需要重新运行
例如,将使用加载类(还有其他的,这里最重要的可能是命名约定)。