我刚刚开始研究ZendFramework2(一般是ZF的新手),在用户指南中,他们在添加新模块时使用自动加载。然而,我觉得对于菜鸟来说,这个解释是很有挑战性的。它们在模块目录中添加一个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(),但我不确定它的用途是什么。用选项实例化自动加载器,但我不确定它到底做了什么。我猜数组的第二个条目指定了在哪里找到模块名称空间的源文件--至少这是我的猜测。然而,我对第一条不太确定。在用户指南中,说明如下:
由于我们正在开发中,我们不需要通过类映射加载files,因此我们为类映射自动加载程序提供了一个空数组。
该文件只返回一个空数组。我不知道这个ClassMapAutoloader的目的是什么。
对不起,如果我的观点不明确,我基本上是想弄清楚在getAutoloaderConfig()中发生了什么,以及mymodule/autoload_classmap.php是用来干什么的。如果有人能对此有所了解,那将是非常感谢的!
发布于 2012-09-13 22:39:16
类映射是用来显示PHP到类的最直接方法的。它本质上是说,“您正在寻找A\Class\Youre\Looking\For,只需查看这个文件:xyz.php。
return array(
'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php'
)如果没有它,PHP必须贯穿整个自动加载程序链,这可能非常昂贵。为什么要说“我们在发展中”?因为类映射文件通常是由某些脚本在生产服务器上生成的。基本上,现在别太担心。这是微观优化.
getAutoloaderConfig()方法只是为了在真正高级的应用程序中提供一些灵活性。大多数情况下,您可以只使用骨架应用程序和骨架模块的样板代码,而不使用它。实际上,您甚至可以暂时删除'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',)部分。
这只是未来改进的一个钩子,如果您刚开始使用ZF2 (比如我;),就不用担心太多了。
发布于 2013-05-06 10:25:53
ZF2有许多自动显示器可用。
最常见的2种(或者说开发人员至少直接与之交互的2种)是Zend\Loader\ClassMapAutoloader和Zend\Loader\StandardAutoloader。
key => value对的关联数组,键表示类,值表示定义类的文件名。zftool.phar生成类映射来快速填充/path/to/ZF2/bin/classmap_generator.php文件。Zend\Loader\AutoloaderFactory旨在管理各种自动机,并确保没有冲突。当然,最终,所有自动加载功能都利用了PHP自动加载功能。
getAutoloaderConfig()的目的是向自动加载器工厂标识该模块的命名空间可用的自动加载器。
在上面所示的示例中,按照偏好顺序,这将是类映射自动加载程序,然后是标准自动加载程序。如果不希望为该模块使用类映射自动加载程序,只需从getAutoloaderConfig()返回的数组中删除引用即可。
保留了方法名getAutoloaderConfig()。如果定义了此方法,则在模块初始化过程中附加一个侦听器(Zend\ModuleManager\AutoloaderListener),它检索此方法返回的配置,并将其添加到统一配置中。
发布于 2014-01-25 06:22:00
web应用程序由许多PHP类组成,每个类通常驻留在一个单独的文件中。这就引入了包含文件的需要。
随着应用程序的大小增加,可能很难包含每个所需的文件。ZendFramework2本身由数百个文件组成,以这种方式加载整个库及其所有依赖项可能非常困难。此外,在执行生成的代码时,PHP解释器将花费CPU时间处理每个包含的文件,即使您没有创建其类的实例。
为了解决这个问题,在PHP5.1中引入了类自动加载特性。PHP函数spl_autoload_register()允许您注册一个自动加载器函数。对于复杂的网站,您甚至可以创建多个自动加载器函数,这些函数被链接在一个堆栈中。
在脚本执行期间,如果PHP解释器遇到一个尚未定义的类名,它依次调用所有已注册的自动加载程序函数,直到自动加载程序函数包含该类或引发"not“错误为止。这允许“延迟”加载,当PHP解释器只在类调用的时刻处理类定义时,当它是真正需要的时候。
因为每个库的供应商都使用自己的代码命名和文件组织约定,因此您必须为每个依赖库注册不同的自定义自动加载器函数,这是相当烦人的(实际上这是一项不必要的工作)。为了解决这一问题,引入了PSR-0标准.
PSR-0标准 (PSR代表PHP标准推荐)定义了应用程序或库必须遵循的推荐代码结构,以保证自动加载程序的互操作性。
web应用程序的每个模块都注册了一个自动加载程序,这样就可以自动加载模块中的任何PHP类。这是由getAutoloaderConfig()类的Module方法完成的。
ZF2有一个名为Zend\Loader的特殊组件,它包含两个常用的自动加载器类的实现:标准自动加载器(Zend\Loader\StandardAutoloader)和类映射自动加载器(Zend\Loader\ClassMapAutoloader)。
基于ZF2的应用程序模块符合PSR-0标准,这使得使用标准自动加载程序成为可能。
类地图自动加载器可以作为标准自动加载程序的更快替代。该自动加载程序希望您将类映射数组传递给它。类映射的每个key=>value对分别是包含该类的类文件的类名和路径。
Zend 2中自动加载的概念在使用Zend框架2书中得到了很好的解释。
https://stackoverflow.com/questions/12415621
复制相似问题