我在遗留项目中使用composer,它有很多没有命名空间的类。重构不是一个选项(它是一个非常庞大的应用程序),但所有新模块都完全符合psr-4标准。遗留代码有自己的自动加载方法(使用类映射,非常有效)。
我的问题是:无论我添加自动加载器方法的顺序,作曲家自动加载器总是先来!这会减慢每个类的负载:每次从遗留代码调用一个类时,它首先尝试将它与所有作曲家自动加载选项(包括findFileWithExtension())匹配,然后才调用替代自动加载器。
我使用PHPStorm + XDebug进行了检查,无论我首先包含哪个自动加载器,都会在旧版自动加载之前调用它。
有没有办法改变这种行为?
提前致谢!!
答案 0 :(得分:4)
好的,伙计们,我找到了解决方案并希望与您分享:spl_autoload_register()函数有第三个参数:$ prepend。设置为true时,它会将自动加载功能添加到自动加载队列,而不是附加它(它实际记录在官方PHP Documentation)。 Composer始终将其设置为true,以便始终首先调用其自动加载器。为了解决这个问题,我改变了传统的自动加载器,将$ prepend设置为true,并在包括作曲家的自动加载后调用它。
希望它有所帮助! :)
答案 1 :(得分:0)
将true
作为第三个参数传递给spl_autoload_register:
spl_autoload_register(your_autoload_func(), true, true);
答案 2 :(得分:0)
你需要知道作曲家使用不同的方式来包含php文件,检查vendor / composer / autoload_real.php以获取详细信息,并记住作曲家可以直接在你包含的地方包含文件
require_once('vendor' . DIRECTORY_SEPARATOR . 'autoload.php');
所以,如果你很幸运有vendor / composer / autoload_static.php,请记住将$ prepend参数添加到你自己的spl_autoload_register()可能还不够。