0

根据PCR-0 提议,自动加载器需要的只是 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 示例这样简单的自动加载器。

在这些情况下会发生什么

  • 框架和库都有自己的自动加载器
  • 框架有自动加载器,但库没有
  • 框架没有自动加载器,库有
4

2 回答 2

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/ -> 包含路径将是 /some/path/MyLib/../MyLib/ClassName.php。您还可以添加更多逻辑来从类名中去除初始的 MyLib 并去掉那个“..”。

确保仅使用require. 它更快,并且每个类名不会多次调用自动加载函数!:) 不需要 include_once/require_once/等。以最快的速度前进。

用法很简单:

include '/some/path/MyLib/Autploader.php';
$loader = new MyLib_Autoloader();
于 2011-06-05T23:51:23.530 回答
1

主要问题是:谁/如何使用您的图书馆?

如果只有你自己,那么使用 Zend 的自动加载器,这将节省你的时间。你不需要重新发明轮子。

如果您必须将您的库公开并用于不同的项目,那么这可能是一个问题,因为它会迫使您的库的用户也拥有 Zend Framework。因此,在这种情况下,您要么制作自己的自动加载器,要么选择框架/库之一,但将其包含在您的库中(注意许可证)。

现在关于自动加载器的使用:只有注册的自动加载器才会被调用。如果你有自己的自动加载器,但你没有在文档中提到如何设置它,你的代码的用户永远不会想到设置它,然后它就不会被使用。

所以基本答案是说:使用许多自动加载器,将它们全部注册,它们都会被调用,一切都会正常工作。但这可能会导致冲突,因为一个自动加载器会尝试加载应该由另一个自动加载器处理的东西,所以你必须小心,不要滥用它们。

于 2011-06-05T00:19:06.200 回答