Composer 自动加载始终是第一位的
Posted
技术标签:
【中文标题】Composer 自动加载始终是第一位的【英文标题】:Composer autoload always comes first 【发布时间】:2016-06-06 12:18:44 【问题描述】:我在一个遗留项目中使用作曲家,该项目有很多没有命名空间的类。重构不是一种选择(这是一个非常庞大的应用程序),但所有新模块都完全符合 psr-4。遗留代码有它自己的自动加载方法(使用类映射,非常高效)。
我的问题是:无论我按什么顺序添加自动加载器方法,composer autoloader 总是先出现!这会减慢每个类的负载:每次我从遗留代码中调用一个类时,它首先尝试将其与所有 composer 自动加载选项(包括 findFileWithExtension() )进行匹配,然后才调用替代自动加载器。
我已经使用 phpStorm+XDebug 对其进行了检查,无论我首先包含哪个自动加载器,Composer 自动加载总是在旧版之前调用。
有没有办法改变这种行为??
提前致谢!!
【问题讨论】:
【参考方案1】:好的,伙计们,我找到了解决方案并想与您分享:spl_autoload_register()
函数有第三个参数:$prepend
。当设置为 true 时,它会将自动加载函数预先添加到自动加载队列中,而不是附加它(它实际上记录在官方 PHP Documentation 中)。 Composer 总是将它设置为 true,因此它的自动加载器总是首先被调用。为了修复它,我更改了旧版自动加载器,将 $prepend
设置为 true,并将其命名为 AFTER,包括作曲家的自动加载。
希望它对某人有所帮助! :)
【讨论】:
你也可以考虑使用optimize-autoloader
和classmap权威
请尽可能高亮“after”这个词。这是让它为我工作的关键。谢谢。【参考方案2】:
将true
作为第三个参数传递给spl_autoload_register:
spl_autoload_register(your_autoload_func(), true, true);
【讨论】:
【参考方案3】:你需要知道composer使用不同的方式来包含php文件,详情查看vendor/composer/autoload_real.php,记住composer可以直接在你包含的地方包含文件
require_once('vendor' . DIRECTORY_SEPARATOR . 'autoload.php');
因此,如果您有幸拥有 vendor/composer/autoload_static.php,请记住将 $prepend 参数添加到您自己的 spl_autoload_register() 可能还不够。
【讨论】:
以上是关于Composer 自动加载始终是第一位的的主要内容,如果未能解决你的问题,请参考以下文章