Zend Framework 2自动加载

And*_*708 12 php zend-autoloader zend-framework2

我刚刚开始研究Zend Framework 2(并且是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__,
                ),
            ),
        );
    }
Run Code Online (Sandbox Code Playgroud)

现在我做了一些挖掘,试图找出这个自动加载的全部内容.据我所知,自动加载使用spl_autoload_register()并且是一种避免require_once()在代码中无处不在的方法.因此,当尝试使用未定义的类时,autoload()将运行已注册的方法,该方法仅执行数组查找,并且如果已添加,则包括如下所示的文件.

// Zend/Loader/ClassMapAutoloader.php
public function autoload($class)
{
    if (isset($this->map[$class])) {
        require_once $this->map[$class];
    }
}
Run Code Online (Sandbox Code Playgroud)

由于性能,这似乎很聪明.我希望我刚才写的是正确的.基于此,我试图getAutoloaderConfig()从第一个代码片段中弄清楚发生了什么,但我很困惑.看起来好像使用了这个方法返回的数组AutoloaderFactory::factory(),但我不确定是出于什么目的.使用选项实例化自动加载器,但确实如此,我不确定.我想数组的第二个条目指定在哪里找到模块命名空间的源文件 - 至少这是我的猜测.然而,我第一个条目并不确定.在用户指南中,它说明如下:

在开发过程中,我们不需要通过类图加载文件,因此我们为类图自动加载器提供了一个空数组.

该文件只返回一个空数组.我不确定这个ClassMapAutoloader的目的是什么.

对不起,如果我的观点不清楚; 基本上我试图弄清楚发生了什么getAutoloaderConfig()以及mymodule/autoload_classmap.php用于什么.如果有人能够对此有所了解,那将非常感激!

Rud*_*eim 21

classmap用于向PHP展示最直接的类.它本质上是在说"你正在寻找A\Class\Youre\Looking\For,只看这个文件:xyz.php.这将表达如下:

return array(
    'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php'
)
Run Code Online (Sandbox Code Playgroud)

没有它,PHP必须贯穿整个自动加载器链,这可能相当昂贵.为什么它会说"我们正在开发中"?因为类映射文件通常是由某些脚本在生产服务器上生成的.基本上,现在就不要太担心了.这是微观优化......

getAutoloaderConfig()方法可以为您提供真正高级应用程序的灵活性.大多数情况下,您只需使用SkeletonApplication和SkeletonModule的样板代码就可以了.真的,你现在甚至可以杀死这个'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',)部分.

它只是未来改进的一个钩子,如果你刚刚开始使用ZF2(就像我一样),就没什么可担心的了.


小智 8

ZF2有许多自动加载机可供选择.

最常见的2个(或者开发人员以任何速率直接与之交互的2个)是Zend\Loader\ClassMapAutoloaderZend\Loader\StandardAutoloader.

  1. classmap自动加载器通常在模块级别使用,以提供简单但快速的数组查找机制.它配置了一key => value对关联数组,键表示类,以及表示定义类的文件名的值.

  2. 另一方面,标准自动加载器设计用于保存"命名空间"和基本目录的列表.然后通过将该命名空间的基本目录路径添加到类名来构建引用但尚未加载的类的路径,以获得类文件的最终绝对路径,然后尝试包括.您可以通过运行/path/to/ZF2/bin/classmap_generator.phpzftool.phar生成类映射来快速填充classmap_autoload.php文件 .

Zend\Loader\AutoloaderFactory旨在管理各种自动加载器,并确保没有冲突.当然,最终所有自动加载功能都利用了PHP SPL自动加载功能.

其目的getAutoloaderConfig()是为自动加载器工厂识别哪个自动加载器可用于此模块的命名空间.

在上面显示的示例中,按优先顺序,这将是classmap自动加载器,然后是标准自动加载器.如果您不希望为该模块使用classmap自动加载器,请简单地从返回的数组中删除引用getAutoloaderConfig().

方法名称getAutoloaderConfig()是保留的.如果定义了此方法,则在模块初始化过程中,将Zend\ModuleManager\AutoloaderListener附加一个listener(),它将检索此方法返回的配置,并将其添加到统一配置中.