【问题标题】:How to replace Zend_Loader_Autoloader efficiently?如何有效地替换 Zend_Loader_Autoloader?
【发布时间】:2012-01-02 11:45:17
【问题描述】:

由于性能问题(基准测试),我正在尝试使用除默认 Zend_Loader_Autoloader 之外的另一个自动加载器。

我尝试了不同的方法,使用:

$autoloader->removeAutoloader(array('Zend_Loader_Autoloader', 'autoload'))
    ->setDefaultAutoloader(array($loader, 'loadClass'));

由于自动加载器与 Zend 框架的大多数组件密切相关,我无法“删除它”。

我做了一个 Xdebug 一步一步调试,看起来 Autoloader 是这样工作的:

1) 获取实例 2) 检查被调用的类根是否是已知的命名空间以及其命名空间是否存在自动加载器 3) 将非命名空间的自动加载器放入堆栈 4) 在每个自动加载器上尝试自动加载器,直到找到一个有效的。

但是,就我而言,我的自动加载器已经这样做了(我正在使用带有 classMap 策略的 Opl Autoloader),我已经用它们各自的路径注册了 namspace。

所以这对我来说看起来有点开销,因为我希望在绕过所有 Zend 检查的查找的最开始时使用我的自动加载器。

您对改进有什么想法吗?我如何在 Zend Framework 项目中有效地使用自定义(和高性能)自动加载器并使用 Zend_Loader_Autoloader

【问题讨论】:

  • @mario,这就是我实际所做的,OPL 提供了一个 ClassMapLoader 及其 classMap 构建器,它生成一个像 "array('My_Class_Name' => 'My/Class/Name.php'); 这样的数组很简单

标签: php autoload zend-autoloader


【解决方案1】:

自动加载器没有“高度链接”。您可以随时使用您喜欢的每个 PSR-0 投诉自动加载器,但在这种情况下,您不应使用 Zend_Loader_Autoloader 将自动加载器注册到 Zend_Loader_Autoloader 以替换 Zend_Loader_Autoloader ;)

spl_autoload_register($myAutoload);

【讨论】:

  • ZF 与 Zend_Loader 和 Zend_Loader_Autoloader 相关联,一些类(IE Zend_Mail)使用 Zend_Loader::loadClass() 方法,它实际上使用 Zend_Loader_Autoloader,据我所知 Zend_Loader_Autoloader 只是 spl_autoloader_register 的包装器,但是因为它倾向于在使用 Zend_Application(需要 Zend_Loader_Autoloader)时自动注册自己。但是,如果我在所有 ZF 引导程序之前提前注册我的,你认为我可以进入自动加载器堆栈的顶部吗?我的目标是永远不要使用 ZF 自动加载器,除非作为备用。
  • 没有注意到,有些组件直接调用loadClass() ...是的,您可以使用spl_autoload_register() 注册任意数量的自动加载器,一旦类存在,PHP 就会破坏自动加载链,意思是:如果你的加载器加载了类,就不会再调用加载器了。
  • 好的,我试试看。 (看看 library/Zend/Mail/Transport/Smtp.php: Zend_Loader::loadClass($connectionClass); )
【解决方案2】:

虽然 Zend 负责人 Mathew 的这篇帖子自己没有回答,但它可能有助于演示如何放入替换自动加载器(以及更有效的自动加载器)

http://mwop.net/blog/262-Backported-ZF2-Autoloaders

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2018-09-19
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多