2012-09-13 55 views
12

我刚开始关注Zend Framework 2(并且通常是ZF的新手),而在user guide中,他们在添加新模块时使用自动加载。不过,我觉得这个解释对于新手来说相当具有挑战性。他们模块目录,这其中包括包含下面的代码中加入了Module.php文件:Zend Framework 2自动加载

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(),但我不确定它的用途。使用选项来自动装载器实例化,但确切的是,我不确定。我猜数组的第二个条目指定在哪里找到模块名称空间的源文件 - 至少这是我的猜测。然而,我的第一个条目并不确定。在用户手册,它说以下内容:

我们正在开发中,我们并不需要通过类映射到加载网络LES, 所以我们提供了类映射自动加载一个空数组。

该文件只是返回一个空数组。我不知道这个ClassMapAutoloader的目的是什么。

对不起,如果我的观点不明确;基本上我试图找出getAutoloaderConfig()中发生的事情以及mymodule/autoload_classmap.php的用途。如果有人能够说明这一点,那将非常感谢!

+8

Zend是如此过度设计其荒谬。 – wesside

+1

绝对。但我认为,如果你找到了解决方法,它实际上非常强大。像Magento一样。 –

+0

我在工作中使用它,它有起伏。不过我更喜欢Kohana,并使用我可能需要的任何Zend库。对不起@ andy124,还没有用过2,抱歉劫持你的问题。 – wesside

回答

21

该类图表显示了PHP最直接的方法。它本质上是说“你你正在寻找A\Class\Youre\Looking\For,没有比这个文件:xyz.php这就要这样表示:

return array(
    'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php' 
) 

没有它,PHP已经在整个自动加载链运行,它可以是相当昂贵为什么当我们处于开发阶段时会说些什么?因为classmap文件通常是由生产服务器上的某个脚本生成的,基本上,现在不用担心它太多,它是微型优化...

getAutoloaderConfig()方法只是为了给你一些真正高级应用程序的灵活性,大多数时候你可以使用Skeleto nApplication和SkeletonModule的样板代码并保持独立。真的,你现在甚至可以杀死'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',)部分。

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

+0

谢谢。你写的关于ClassMapAutoloader的例子在你的例子中是合理的,但我不确定为什么数组中的键是'Zend \ Loader \ ClassMapAutoloader'。该值指的是甚至不是一个类的PHP文件;它只是返回一个数组。我的猜测是它告诉'ClassMapAutoloader'查找该文件以配置类映射。不是我现在会使用它,而是'autoload_classmap.php'的目的,然后返回一个类的名称数组作为键和路径的值?从我的理解中可以看出,这不是必要的,而只是一种优化。 – Andy0708

+1

Zend \ Loader \ ClassMapAutoloader是一个类。请参阅https://github.com/zendframework/zf2/blob/master/library/Zend/Loader/ClassMapAutoloader.php 所以它说“使用ClassMapAutoloader并将文件autoload_classmap.php作为参数”。自动加载器然后使用该文件返回的数组将映射到特定文件。 这是否更清楚一点? –

8

ZF2有一些自动加载机可用。

2个最常见的(或2个开发人员直接与之交互的)是Zend\Loader\ClassMapAutoloaderZend\Loader\StandardAutoloader

  1. 的类映射自动加载机通常是在模块级用于 提供一个简单而快速的阵列查找机制。它被配置为 ,关联数组为key => value对,关键字 代表类,代表文件名 的值定义类。

  2. 另一方面,标准自动装载机的设计目的是保存“名称空间”和基本目录的列表“ ”。然后 建立到被引用但尚未加载的类的路径 预先将该名称空间的基本目录路径添加到类 名称,以便到达类文件的最终绝对路径,其中 它然后试图包括。您可以通过运行 /path/to/ZF2/bin/classmap_generator.phpzftool.phar生成 classmap来快速填充 classmap_autoload.php文件。

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

getAutoloaderConfig()的目的是向自动加载器工厂标识哪些自动加载器可用于该模块的名称空间。

在上面显示的示例中,按优先顺序排列的是自动加载器,后跟标准自动加载器。如果您不希望为该模块使用类映像自动加载器,只需从getAutoloaderConfig()返回的数组中删除引用。

保留方法名称getAutoloaderConfig()。如果定义了此方法,则在模块初始化过程中会附加一个侦听器(Zend\ModuleManager\AutoloaderListener),该侦听器将检索此方法返回的配置,并将其添加到整合配置中。

+0

+1非常清晰和简单的解释。 – Andy0708

3

一个Web应用程序由许多PHP类组成,每个类通常驻留在一个单独的文件中。这介绍了 需要包括这些文件。

随着您的应用程序的规模增大,可能很难包含每个需要的文件 。 Zend Framework 2本身由数百个文件组成,其中包含 ,并且以这种方式加载整个库及其所有依赖关系可能非常困难。此外,执行生成的代码时,即使您未创建其类的实例,PHP解释器也会花费CPU时间来处理每个包含的文件。

为了解决这个问题,在PHP 5.1中引入了类自动加载功能。 PHP函数spl_autoload_register()允许您注册 和自动装载机函数。对于复杂的网站,您甚至可以创建几个自动加载器函数,这些函数被链接在一个堆栈中。

在脚本执行,如果PHP解释器遇到哪些尚未被定义的类名 ,它调用所有已注册的自动加载功能 反过来,直到自动装卸功能包括类或“未找到”的错误是 上调。这允许“懒惰”加载,当PHP解释器仅在类调用时才处理类 定义,当它真的需要时。

由于每个库的供应商使用自己的代码命名和文件组织公约, 你必须注册每各相关库, 这是相当恼人的不同的自定义自动加载功能(实际上这是一个不必要的工作)。为了解决这个问题,引入了PSR-0标准 。

PSR-0 standard (PSR代表PHP标准推荐) 定义了一个应用程序或库必须遵循 保证自动装载机的互操作性推荐的代码结构。

Web应用程序的每个模块都会注册一个自动加载器,这可以自动加载模块中的任何PHP类。这是用Module类的getAutoloaderConfig()方法进行的。

ZF2具有名为Zend\Loader特殊部件,其包含实施方式中,两个常用的自动加载机类 :标准自动装载机(Zend\Loader\StandardAutoloader) 和类映射自动装载机(Zend\Loader\ClassMapAutoloader)。

基于ZF2的应用模块符合PSR-0标准的事实使得使用标准自动装载机成为可能。

类映射自动加载器可以用作标准自动加载器的更快速替换。 此自动加载器希望您将它传递给一个类映射数组。每个键=>值对类 分别是包含该类的PHP文件的类名和路径。

Zend Framework 2中自动加载的概念在Using Zend Framework 2书中有详细说明。