作曲家自动加载始终是第一位的


Composer autoload always comes first

我在一个遗留项目中使用作曲家,该项目有很多没有命名空间的类。重构不是一种选择(这是一个非常庞大的应用程序),但所有新模块都完全符合 psr-4。遗留代码有自己的自动加载方法(使用类映射,非常有效)。

我的问题是:无论我以哪种顺序添加自动加载器方法,作曲家自动加载器永远是第一位的!这减慢了每个类的加载速度:每次我从遗留代码调用一个类时,它首先尝试将其与所有作曲家自动加载选项(包括 findFileWithExtension() )匹配,然后才调用替代自动加载器。

我已经使用 PHPStorm+XDebug 检查了它,无论我首先包含哪个自动加载器,Composer 自动加载总是在遗留加载器之前调用。

有没有办法改变这种行为?

提前感谢!!

好的,伙计们,我找到了解决方案并想与您分享:spl_autoload_register()函数还有第三个参数:$prepend 。当设置为 true 时,它会将自动加载函数附加到自动加载队列,而不是附加它(它实际上记录在官方 PHP 文档中)。作曲家始终将其设置为 true,以便始终首先调用其自动加载器。为了修复它,我更改了旧版自动加载器,将$prepend设置为 true,并在包含作曲家的自动加载调用它。

希望它对某人有所帮助! :)

true作为第三个参数传递给spl_autoload_register:

spl_autoload_register(your_autoload_func(), true, true);

您需要注意,作曲家使用不同的方式来包含 php 文件,检查供应商/作曲家/autoload_real.php以获取详细信息,并记住作曲家可以直接在包含的位置包含文件。

require_once('vendor' . DIRECTORY_SEPARATOR . 'autoload.php');

因此,如果您有幸拥有供应商/作曲家/autoload_static.php请记住,将$prepend参数添加到您自己的 spl_autoload_register() 中可能还不够。