2011-06-04 41 views
0

根据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's还是库?我是否必须实现像Zend一样复杂的自动加载器,或者像PCR-0例子那样简单。

在这些情况下,会发生什么

  • 两个框架和图书馆都有自己的自动加载
  • 框架有自动加载,但图书馆没有
  • 框架有NO自动加载磁带机和磁带库具有

回答

1

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

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

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

现在关于自动加载机的使用情况:只会调用注册的自动加载机。如果你有自己的自动加载器,但是你没有提到如何在你的文档中设置它,那么你的代码的用户将永远不会考虑设置它,然后它不会被使用。

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

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。速度更快,并且每个类名称的autoload函数都不会多次调用! :)不需要include_once/require_once /等。以最快的速度前进。

用法很简单,只要:

include '/some/path/MyLib/Autploader.php'; 
$loader = new MyLib_Autoloader(); 
相关问题