根据PCR-0 proposal,所有自动加载器需要的是autoload()函数。 Zend有一些自动加载类
Zend_Loader()
Zend_Loader_Autoloader()
Zend_Loader_Autoloader_Resource()
Zend_Loader_Autoloader_Interface()
我猜它有所有这些类,因为它是一个框架,所以它需要加载自己的类,以及开发人员可能添加的任何库以及没有自己的自动加载器的库类。
我有一个库(普通库,而不是框架)。现在它没有自动加载器所以我使用Zend的Zend_Loader_Autoloader_Resource - > addResourceType()。如果我为它编写自动加载器,将使用哪个自动加载器:Zend或库?我是否必须实现像Zend一样复杂的自动加载器或者像PCR-0示例那样简单的自动加载器。
在这些情况下会发生什么
答案 0 :(得分:2)
我建议坚持使用直接路径>类映射并实现自己的自动加载器,如下所示:
class MyLib_Autoloader
{
public function __construct() {
spl_autoload_register(array($this, 'autoload'));
}
public function autoload($className)
{
if (substr($className, 0, 6) == 'MyLib_') {
include dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR strtr($className, '_', DIRECTORY_SEPARATOR) . '.php';
return true;
}
return false;
}
}
这将检查该类是否来自您的命名空间并加载该文件。假设您的自动加载器位于/ some / path / MyLib / - > include路径为/some/path/MyLib/../MyLib/ClassName.php。您还可以添加更多逻辑来从类名中删除初始MyLib并删除“..”。
确保仅使用require
。它更快,并且每个类名不会多次调用自动加载功能! :)不需要include_once / require_once / etc.以最快的速度前进。
用法很简单:
include '/some/path/MyLib/Autploader.php';
$loader = new MyLib_Autoloader();
答案 1 :(得分:1)
主要问题是:您的图书馆将由谁/如何使用?
如果仅限于您,则使用Zend的自动加载器,这将节省您的时间。你不需要重新发明轮子。
如果你必须公开你的库并在不同的项目中使用,那么这可能是一个问题,因为它会迫使你的库的用户也有Zend Framework。因此,在这种情况下,要么您自己制作自动加载器,要么选择一个框架/库,而是将其包含在您的库中(注意许可证)。
现在关于自动加载器的使用:只会调用已注册的自动加载器。如果您有自己的自动加载器,但没有提及如何在文档中设置它,那么代码的用户将永远不会想到设置它,然后它就不会被使用。
所以基本的答案是说:使用许多自动加载器,将它们全部注册,它们将全部被调用,一切都会正常工作。但这可能会导致冲突,因为一个自动加载器会尝试加载一些本应由另一个自动加载器处理的东西,所以你必须小心这一点,而不是滥用它们。