2

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

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

提前致谢!

4

2 回答 2

3

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

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

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

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

于 2013-11-04T22:25:25.957 回答
1

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

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

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

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

于 2013-11-04T22:30:38.717 回答