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