到目前为止,我已经使用了程序化的独立自动加载器功能,并使用spl_autoload_register()注册它们以自动加载我的(通常)命名空间类。最近,我注意到有人提到将自动加载器类与一些着名的PHP框架结合使用。
这几天我的几乎所有代码都是面向对象的,但在这个实例中,我没有看到在基本函数中使用类“Autoloader”的优势。在可测试性方面,我觉得在我的测试中使用class_exists()检查来验证过程函数是否正确加载文件是非常好的。
所以我的问题是三个:
更新
以下是我可能使用的典型自动加载功能的一些示例代码。它是元代码,所以不要寻找错别字。我组织我的目录结构,以便它们镜像命名空间。从理论上讲,假设的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;
}
}
答案 0 :(得分:4)
您正在将功能与方法进行比较。那只是语法糖。
除非您有基于地图的自动加载器或具有内置依赖关系表的自动加载器,否则您不需要任何类级别属性来跟踪事物(否则可能诉诸于静态或全局变量)。运行时可重配置性在实践中也不是必需的。
您可以使用常量等对程序自动加载器项目进行配置。具有构造函数属性对于使用方法实现进行重用并不具有重要意义。它看起来可能看起来更好。
答案 1 :(得分:0)
如果您已经使用了框架的另一个主要部分,请使用预构建的,否则它并不重要。
此外,使用一个自动加载器,注册多个命名空间/目录将会略微减少内存,但这并不是一个问题。