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

时间:2013-11-04 22:04:39

标签: php composer-php

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

当我使用PSR-0或类图自动加载一个类后面实际发生的事情?它只是在指定路径中的指定文件上调用include(或一些包含变体)。它实际上是在为文件定义浏览文件并构建自己的文件吗?它是否正在做一些与文件包含类似的东西?

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

在幕后作曲家使用spl_autoload_register注册包含你的班级的自动加载器功能。

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

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

你可以挖掘Github repository并亲自看看。