我刚刚开始研究 Zend Framework 2(总体来说对 ZF 还很陌生),并且在 user guide 中,他们在添加新模块时使用自动加载。然而,我发现这个解释对于一个新手来说相当具有挑战性。他们在模块目录中添加一个 Module.php
文件,其中包含以下代码:
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
现在我做了一些挖掘,试图弄清楚这个自动加载是怎么回事。据我了解,自动加载使用 spl_autoload_register()
,是避免代码中到处都有 require_once()
的方法。因此,当尝试使用未定义的类时,将运行已注册的 autoload() 方法,该方法仅执行数组查找并包含如下文件(如果已添加)。
// Zend/Loader/ClassMapAutoloader.php
public function autoload($class)
{
if (isset($this->map[$class])) {
require_once $this->map[$class];
}
}
由于性能原因,这看起来很聪明。我希望我刚才写的是正确的。基于此,我试图从第一个代码片段中弄清楚 getAutoloaderConfig() 中发生了什么,但我很困惑。似乎此方法返回的数组用于 AutoloaderFactory::factory() ,但我不确定其用途。似乎用选项实例化自动加载器,但我不确定它到底有什么作用。我猜数组的第二个条目指定在哪里找到模块 namespace 的源文件 - 至少这是我的猜测。然而,我不确定第一个条目。在用户指南中,它说了以下内容:
As we are in development, we don’t need to load files via the classmap, so we provide an empty array for the classmap autoloader.
该文件仅返回一个空数组。我不确定这个 ClassMapAutoloader 的目的是什么。
抱歉,如果我的观点不清楚;基本上我想弄清楚 getAutoloaderConfig()
中发生了什么以及 mymodule/autoload_classmap.php
的用途。如果有人能对此有所启发,我们将不胜感激!
最佳答案
类映射向 PHP 展示了访问类的最直接方式。它本质上是在说“您正在寻找 A\Class\Youre\Looking\For
,只需查看此文件:xyz.php
。这可以表达为这个:
return array(
'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php'
)
如果没有它,PHP 必须运行整个自动加载器链,这可能会非常昂贵。为什么要说“我们正在开发中”?因为类映射文件通常是由某些脚本在生产服务器上生成的。基本上,现在不用太担心。这是微观优化...
getAutoloaderConfig()
方法只是为您在真正高级的应用程序中提供一些灵 active 。大多数时候,您可以只使用 SkeletonApplication 和 SkeletonModule 的样板代码,而不用管它。实际上,您甚至可以暂时删除 'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',)
部分。
这只是 future 改进的一个钩子(Hook),如果您刚刚开始使用 ZF2(像我一样;),则无需担心太多。
关于php - Zend Framework 2 自动加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12415621/