php - Zend Framework 2 自动加载

标签 php zend-framework2 zend-autoloader

我刚刚开始研究 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/

相关文章:

使用命名空间时找不到 PHP 类

php - 从表#1 获取最新 ID 以确定表#2 的新 ID

mysql - 发电机 : How to call dynamodb api from ZF2 rest application

php - 通过 .htaccess 将 $_GET 变量传递给虚拟目录

javascript - AJAX 和 PHP/SQL 错误位置的不确定性

routes - 文字路由和段路由有什么区别?

php - 如何在zend框架中嵌套动态查询?

php - 如何将第 3 方库添加到 magento?

php - 实现 Zend Framework 2 自动加载器

php - PHPUnit 代码覆盖率如何忽略我的自动加载器?