【问题标题】:When I auto-load a class/file with composer, what is actually happening behind the scenes?当我使用 Composer 自动加载类/文件时,幕后实际发生了什么?
【发布时间】:2013-11-05 06:30:38
【问题描述】:

我还没有在网上其他地方找到这个问题的严格答案,我想知道作曲家自动加载到底是如何工作的。

当我使用 PSR-0 或类映射自动加载类时,幕后实际发生了什么?它只是在指定路径中的指定文件上调用包含(或某些包含变体)。它实际上是在浏览文件以查找类定义并构建自己的文件以包含吗?它是否在做一些不类似于文件包含的事情?

提前致谢!

【问题讨论】:

    标签: php composer-php


    【解决方案1】:

    PSR-0 自动加载器只是一个附加到全局 PHP 进程的函数,spl_autoload_register()。每当 PHP 需要实例化一个未知的类时,就会调用该注册函数,因此这是在 PHP 失败之前让类代码已知的最后时刻。

    自动加载的实现可以非常复杂,也可以非常简单,但在每种情况下,它都会使用include()require()(可能使用_once,但这并不是真正需要的) PHP 已知的类代码。您还可以实现对eval() 的调用,以动态添加一些声明所需类的代码,但这仅用于学术用途 - 我还没有看到它在实际案例中使用。

    这同样适用于类映射加载。 classmap 数组包含类的名称作为键,包含文件的文件名作为值。这适用于类名和文件路径之间没有 PSR-0 兼容的规则集映射的情况。

    如果您想了解 Composer 如何进行自动加载的更多详细信息,您应该查看 vendor/composer 中生成的文件。有关 PHP 自动加载的一般工作原理的基本知识将有助于了解其中发生的情况。

    【讨论】:

    • 好的。这是一个完美的解释。所以php去检查这个类是否已经在当前脚本中定义了。如果没有,那么它会检查它是否存在于自动加载器中。您会建议先阅读 php autoload 本身,还是尝试通过阅读 composer 源代码/生成的文件来学习 php 自动加载是一种更好的学习方式?
    • 你应该首先阅读 PHP 自动加载。 Composer 然后有一个工作示例要检查。
    • 谢谢斯文。现在正在检查。
    【解决方案2】:

    在幕后作曲家使用spl_autoload_register 注册一个包含您的类的自动加载器函数。

    注册的函数遵循标准化的命名空间/路径解析算法(基本上将类名中的所有“\”或“_”视为指定基目录的路径分隔符)来查找要包含的 php 文件。

    此外,当您运行 composer install 时,它会创建路径和命名空间之间关系的缓存索引,以加快路径解析。

    您可以挖掘Github repository 并亲自查看。

    【讨论】:

    • 好的。这更有意义。通过查看 composer 生成的 autoload_namespaces.php 和 autoload_classmap.php 文件,我刚刚开始看到这一点,但我仍然对它实际在做什么感到很困惑。所以如果我理解正确的话。在 php 的某个地方有一个自动加载堆栈,用于存储类和函数的定义,而 composer 只是让实际使用这个特性变得更容易/更有条理。那么另一个问题。是什么决定了哪些文件实际上自动加载了这些函数?
    • 当您在脚本中使用类定义时,php 会尝试加载该类。如果类定义不存在,则在抛出错误之前,php 会尝试自动加载类,调用您通过 spl_autoload_register 或 __autoload 函数手动注册的所有函数。 Composer 构建了一个标准化的堆栈,但您可以创建自己的堆栈。默认情况下,php 中没有可用的堆栈。 php.net/manual/en/language.oop5.autoload.php
    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多