gpt4 book ai didi

php - 如何防止 PHP namespace 冲突(预 bundle )

转载 作者:可可西里 更新时间:2023-11-01 13:22:24 26 4
gpt4 key购买 nike

假设我们有一个 PHP 项目,其依赖项 AB 分别依赖于 PHP 库 X,但版本不同。

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

现在,许多 PHP 应用程序允许用户通过上传预先捆绑的包并将它们解压缩到特定的插件目录来安装插件。

如果 AB 是这样的预捆绑插件,并且都带有自己版本的库 X,我们可能会遇到问题因为没有依赖管理器可以为我们选择兼容的 X 或在没有的情况下显示错误。

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

我的问题是:

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

最佳答案

不改代码就没有解决办法。如果文件系统中确实存在“\Vendor\AnyClass”的两个版本,并且执行代码以同时使用它们,则会出现错误,因为不允许重新声明该类,或者因为预期的类不兼容。只有当类的接口(interface)实现相同时,它才会起作用,即两个代码兼容。如果兼容性问题不仅是一个类,而是一整棵对象树,即使它们提供了兼容的接口(interface),也可能对混合来自不同版本的类 react 不佳,那么兼容性问题就很复杂。

更改命名空间就是更改代码。谁对此负责?我可以想到一些能够为每个插件添加特定 namespace 前缀的自动代码解析器,但据我所知,该任务尚未在 PHP 中完成。我公司的Java哥们说那里已经解决了这样的问题,但我没有详细信息。

此外,它使您的代码库翻倍,并且重复的代码必须仅共享您拥有的一个操作码缓存。

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

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

更新: 我再次咨询了我的 Java 同事,他们对 Java 的说法与我对 PHP 的说法基本相同:你不能在同一个类名下有两个不同版本的类,并且即使对于 Java 也没有“魔法”,只是将类重命名为不同的命名空间。

关于php - 如何防止 PHP namespace 冲突(预 bundle ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com