到目前为止,我已经使用了程序独立的自动加载器函数,并使用spl_autoload_register()注册它们以自动加载我的(通常)命名空间类 . 最近,我注意到人们提到将自动加载器类与一些着名的PHP框架结合使用 .
几乎所有的代码都是面向对象的,但是我并没有看到在这个实例中使用类"Autoloader"优于基本函数的优点 . 在可测试性方面,我觉得在我的测试中使用class_exists()检查来验证程序功能是否正确加载文件 .
So my questions are three:
-
哪些优点或功能(如果有的话)可能会影响我重构事物并开始使用完整的对象来自动加载类文件?
-
在明显的OOP功能之外我是否缺少一些明显的优势?
-
你能为程序或类自动加载器提供案例吗?
UPDATE
下面是我可能使用的典型自动加载功能的一些示例代码 . 它's metacode, so don'吨寻找错别字 . 我组织我的目录结构,以便它们镜像命名空间 . 理论上,假设 explode_namespaces()
函数可以作为静态方法包含在类中的静态 autoload()
方法中,因此这是一个好处 . 将这些不同的"utility"函数组合为单个类中的方法可能更清晰 .
function autoload($class_name)
{
$root = APP_LIBS; // a directory path constant set at config time
if ($namespaces = explode_namespaces($class_name)) {
$domain = array_shift($namespaces);
$root .= "/$domain/";
$class_name = array_pop($namespaces);
$directories = array();
foreach ($namespaces as $directory) {
$directories[] = $directory;
}
$root .= implode($directories, '/');
}
$file = "$root/$class_name.php";
if (file_exists($file)) {
include $file;
}
}
2 回答
您正在将函数与方法进行比较 . 那只是语法糖 .
除非您有基于 Map 的自动加载器或具有内置依赖关系表的自动加载器,否则您不需要任何类级别属性来跟踪事物(否则可能诉诸静态或全局变量) . 运行时可重配置性在实践中也不是必需的 .
您可以创建一个程序自动加载器项目 - 可以使用常量进行配置等 . 具有构造函数属性对于使用方法实现进行重用并不具有重要意义 . 它可能看起来稍微好一些 .
如果您已经使用了框架的另一个主要部分,请使用预构建的,否则它并不重要 .
此外,使用一个自动加载器,注册多个命名空间/目录将会略微减少内存,但这并不是真正的问题 .