Composer 自动加载总是最先出现

Composer autoload always comes first

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

我的问题是:无论我以何种顺序添加自动加载器方法,composer 自动加载器总是排在第一位!这会减慢每个 class 的加载速度:每次我从遗留代码中调用 class 时,它首先会尝试将其与所有作曲家自动加载选项(包括 findFileWithExtension() )进行匹配,并且只有这样它才会调用备用自动加载器。

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

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

提前致谢!!

好的,伙计们,我找到了解决方案并想与大家分享:spl_autoload_register() 函数有第三个参数:$prepend。当设置为 true 时,它​​会将自动加载函数添加到自动加载队列中,而不是附加它(它实际上记录在官方 PHP Documentation 中)。 Composer 总是将它设置为 true,因此它的自动加载器总是首先被调用。为了修复它,我更改了旧版自动加载器,将 $prepend 设置为 true,并将其命名为 AFTER 包括作曲家的自动加载。

希望对大家有所帮助! :)

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

spl_autoload_register(your_autoload_func(), true, true);

您需要注意 composer 使用不同的方式来包含 php 文件,请查看 vendor/composer/autoload_real.php 以了解详细信息,并记住 composer 可以直接在该位置包含文件你在哪里包括

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

所以如果你有幸拥有 vendor/composer/autoload_static。php 请记住,将 $prepend 参数添加到你自己的 spl_autoload_register() 可能还不够。