我还没有在网上其他地方找到这个问题的严格答案,并且想知道作曲家自动加载究竟是如何工作的。
当我使用 PSR-0 或 classmap 自动加载类时,幕后实际发生了什么?它只是在指定路径中的指定文件上调用包含(或某些包含变体)。它实际上是在浏览文件以查找类定义并构建自己的文件以包含吗?它是否在做一些不类似于文件包含的事情?
提前致谢!
我还没有在网上其他地方找到这个问题的严格答案,并且想知道作曲家自动加载究竟是如何工作的。
当我使用 PSR-0 或 classmap 自动加载类时,幕后实际发生了什么?它只是在指定路径中的指定文件上调用包含(或某些包含变体)。它实际上是在浏览文件以查找类定义并构建自己的文件以包含吗?它是否在做一些不类似于文件包含的事情?
提前致谢!
PSR-0 自动加载器只是一个附加到全局 PHP 进程的函数,带有spl_autoload_register()
. 每当 PHP 需要实例化一个未知的类时,就会调用该注册函数,因此这是在 PHP 失败之前让类代码已知的最后时刻。
自动加载的实现可以非常复杂,也可以非常简单,但在每种情况下,它都会使用include()
or require()
(可能使用_once
,但这并不是真正需要的)来使 PHP 知道类代码。您还可以实现调用以eval()
动态添加一些声明所需类的代码,但这只是用于学术用途 - 我还没有看到它在实际案例中使用。
这同样适用于类映射加载。classmap 数组包含类的名称作为键,包含文件的文件名作为值。这适用于类名和文件路径之间没有 PSR-0 兼容的规则集映射的情况。
如果您想了解 Composer 如何进行自动加载的更多详细信息,您应该查看vendor/composer
. 关于 PHP 自动加载一般如何工作的基本知识将有助于理解那里发生的事情。
在幕后作曲家使用spl_autoload_register注册一个包含您的类的自动加载器函数。
注册的函数遵循标准化的命名空间/路径解析算法(基本上将类名中的所有“\”或“_”视为指定基目录的路径分隔符)来查找要包含的 php 文件。
此外,当您运行composer install
它时,会创建路径和命名空间之间关系的缓存索引,以加快路径解析。
您可以在Github 存储库中挖掘并亲自查看。