【发布时间】:2011-12-13 02:36:35
【问题描述】:
到目前为止,我已经使用了程序独立的自动加载器函数并将它们注册到 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;
}
}
【问题讨论】:
-
我已从您的问题中删除了“答案”部分,因为它与问题无关。您应该考虑添加自己的答案,它可能会对其他人有所帮助:)