到目前为止,我已经使用了程序化的独立自动加载器函数,并将它们注册到spl_autoload_register()以自动加载我的(通常)命名空间类。不过,最近,我注意到有人提到将自动加载器类与一些著名的 PHP 框架结合使用。
这些天,我几乎所有的代码都是面向对象的,但我并没有真正看到在这个实例中使用“Autoloader”类而不是基本函数的优势。在可测试性方面,我觉得在我的测试中使用class_exists()检查来验证程序函数是否正确加载文件感觉很好。
所以我的问题是三个:
- 哪些优点或特性(如果有的话)可能会促使我重构事物并开始使用完整的对象来自动加载类文件?
- 除了明显的 OOP 功能之外,我是否遗漏了一些明显的优势?
- 您能否为程序自动加载器或类自动加载器提供一个案例?
更新
下面是我可能使用的典型自动加载功能的一些示例代码。这是元代码,所以不要寻找错别字。我组织我的目录结构,以便它们反映命名空间。理论上,假设explode_namespaces()
函数可以作为静态方法与autoload()
类中的静态方法一起包含,所以这是一个好处。将这些不同的“实用程序”函数组合为单个类中的方法可能会更简洁。
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;
}
}