Php 多个作曲家自动加载器的执行顺序

Php 多个作曲家自动加载器的执行顺序,php,composer-php,Php,Composer Php,我有一个多模块的项目。每个模块在其内部使用Composer,并且基本上独立于其他模块 但是,有些模块共享具有不同版本的依赖项。这些依赖关系在很大程度上是向后兼容的,并且使用语义版本控制 我希望确保具有最高语义版本的依赖项优先。这将允许所有模块共享相同的依赖项,并且这些依赖项的向后兼容性将确保没有任何中断 我的计划是通过控制调用单个自动加载器上的require\u一次的顺序来实现这一点。下面的代码是一个示例,实际上是生成的 require_once(__DIR__ . '/moduleA/vend

我有一个多模块的项目。每个模块在其内部使用Composer,并且基本上独立于其他模块

但是,有些模块共享具有不同版本的依赖项。这些依赖关系在很大程度上是向后兼容的,并且使用语义版本控制

我希望确保具有最高语义版本的依赖项优先。这将允许所有模块共享相同的依赖项,并且这些依赖项的向后兼容性将确保没有任何中断

我的计划是通过控制调用单个自动加载器上的
require\u一次的顺序来实现这一点。下面的代码是一个示例,实际上是生成的

require_once(__DIR__ . '/moduleA/vendor/autoload.php');
require_once(__DIR__ . '/moduleB/vendor/autoload.php');
require_once(__DIR__ . '/moduleC/vendor/autoload.php');
我所做的主要假设是,如果一个自动加载器在另一个之前需要,它将优先于后面的加载器

但是我发现,相反的是正确的。最后出现的自动加载器似乎比其他的要优先

假设类
Foo\MyClass
是这些模块之间共享的依赖项。我希望通过上述加载顺序,
Foo\MyClass
将从
moduleA/vendor/…
中获取

相反,它来自于
moduleC/vendor/…

我可以翻转生成的顺序来解决这个问题,但我想验证PHP自动加载程序是否有一个可预测的顺序

PHP执行自动加载程序的顺序是什么?多个作曲家自动加载器会以任何方式影响这一点吗


谢谢。

事实上,你陷入了困境,但你已经走出了一半,看不见了

您的情况的缺点是,您的模块可能依赖于不兼容的第三方库。您提到它们使用语义版本控制,但这只涉及向上兼容性,例如“如果以兼容的方式向旧版本添加新功能,则小版本会增加”。这意味着这个新版本不向后兼容

假设模块A使用的是库的1.0.7版本,模块B使用的是1.2.5版本。该库在版本1.2中的类中添加了一个新方法,模块B正在使用该方法。模块B能否与模块A的类版本1.0.7一起运行?当然不是。您希望两个模块都使用两个模块的最高兼容版本1.2.5运行

如何得到这个?仅使用一个Composer自动加载程序和一个中心依赖项定义

如果您可以创建一个
composer.json
文件,其中包含所有模块a、B和C的依赖关系,并且每个模块都声明它对其他库的依赖关系,composer将收集所有这些库,从中计算“最佳”可用版本,并创建一个自动加载器,该自动加载器将明确地只加载这些库

附加优点:每个库只有一个版本,没有副本。只有一个autoloader对象具有关于所有可用类的全局知识(这可以稍微优化自动加载)

你已经走到一半了。您的每个模块必须已经有一个本地
composer.json
,其中说明了版本要求。添加一个自动加载模块本身的定义,并给它一个名称。然后,您可以在中心的
composer.json
中引用该名称(如果存储库是私有的,您可能需要添加它们),您就差不多完成了。如果您真的需要在定义的路径中使用这些模块,那么可能需要对路径进行一些修改

但仅此而已


然后你解决了另一件事:如果模块A需要模块B的一小部分怎么办?使用Composer,您可以将该依赖关系与所有库一起声明,即使您忘记安装模块B,Composer也会为您执行此操作,或提醒您。

找到答案,Composer默认为自动加载程序。我也有同样的情况,今天你是使用多个自动加载器,还是只使用一个具有所有依赖项的自动加载器?我刚刚遇到了同样的问题,Composer prepend太糟糕了!你找到解决办法了吗?找到了。添加“prepend autoload”配置:感谢Sven提供了深思熟虑的答案。正如您正确指出的,这将仅涵盖向上兼容性。不幸的是,在核心项目采用Composer之前,这只是权宜之计。计划是最终将一切移交给作曲家。但这需要逐步完成,替换小块。其中每一段都是一个作曲家模块。不太理想,但不是这样,就是根本没有作曲家!回答得好!我有一个类似的例子,你知道供应商较少的自动加载器是否对性能有很大影响吗?我认为这是拥有多个自动加载器的唯一原因。如果不亲自进行性能测试,我不会尝试估计任何性能数字。事实上,这完全受测试情况的约束,很难一概而论。换句话说:即使你发现拥有多个小型自动装弹机比一个大型自动装弹机对你来说要快一点,它也只适用于你正在测量的情况。说“更小的自动加载程序总是更快”很可能是错误的,最重要的是:管理多个composer.json依赖文件是一件非常麻烦的事情,应该避免。考虑一下——如果您只想为一个子项目部署依赖项,而不包括其他子项目,那么这种方法并不理想。除非有其他选择。我们在php jwt中遇到过这种情况。它存在于我们必须用于第三方API的大多数SDK中。。。和成长。不过,我们绝对讨厌作曲家,也决不会在我们的制作环境中使用那个些废话。