如何防止PHP命名空间冲突(预绑定包)

时间:2016-05-21 03:13:19

标签: php namespaces composer-php version conflict

假设我们有一个PHP项目,其依赖项 A B 各取决于PHP库 X ,但版本不同。< / p>

通常,人们可以使用PHP依赖管理器,例如composer,它可以通过在与 A B兼容的版本中包含 X 来解决此冲突。 ;如果无法解决冲突,则显示错误。

现在,许多PHP应用程序允许用户只需上传预先捆绑的软件包并将其解压缩到特定的插件目录即可安装插件。

如果 A B 是这样的预捆绑插件,并且两者都会带来他们自己的库 X 版本,我们可能会遇到问题因为没有依赖管理器可供我们选择兼容的 X ,或者在没有依赖管理器时显示错误。

为防止由于PHP无法将库 X 以不同版本加载两次到同一命名空间而导致的任何此类冲突,我们可以将 A 设置为< strong> X 和 B X 进入不同的命名空间(这可能很难自动完成,因为我们需要一个PHP解析器...)

我的问题是:

  • 你会如何解决这个问题?你能推荐这种方法还是有更好的解决方案?

1 个答案:

答案 0 :(得分:5)

没有更改代码就没有解决方案。如果文件系统中确实存在两个版本的'\ Vendor \ AnyClass',并且执行代码以同时使用它们,则会出现错误,因为不允许重新声明该类,或者因为期望的类不兼容。它只有在类的接口实现相同时才有效,即两个代码是兼容的。如果不仅是一个类,而是整个对象树可能对来自不同版本的混合类反应很差,即使它们提供兼容的接口,兼容性问题也很复杂。

更改命名空间正在改变代码。谁对此负责?我可以想到一些能够为每个插件添加特定命名空间前缀的自动代码解析器,但是我的PHP知识还没有完成该任务。我公司的Java人员发表了一些评论,说这个问题已经解决了,但我没有细节。

此外,它会使您的代码库加倍,并且重复的代码只能共享您拥有的一个操作码缓存。

我知道Wordpress的核心开发人员仍然在努力解决这个问题。关于如何使用Composer进行依赖关系管理(即插件及其依赖关系),有一些编码建议,但我认为他们现在没有取得足够的进展。

基本上你有两个选择:1。创建一个代码名称空间前缀,解析属于一个插件的所有文件(因此插件作者必须以某种方式包含他的依赖项),更改代码,使用代码重复,看看什么等待你调试。缺点是该插件之外的任何代码都不能直接使用插件代码,因为这意味着知道创建的前缀。 2.实现某种形式的依赖关系管理,最好使用Composer,而不要更改名称空间。

更新:我再次咨询了我的Java同事,他们基本上就我对PHP所做的Java做了同样的声明:你不能在同一个类名下有两个不同版本的类,即使是Java,也没有“魔力”,但是将类重命名为不同的命名空间。

相关问题