当我使用作曲家自动加载类/文件时,幕后实际发生了什么


When I auto-load a class/file with composer, what is actually happening behind the scenes?

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

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

提前感谢!

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

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

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

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

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

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

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

您可以在Github存储库中挖掘并亲自查看。