le_*_*e_m 6 php conflict namespaces version composer-php
假设我们有一个PHP项目,其依赖项A和B各取决于PHP库X,但是在不同的版本中.
通常,可以使用PHP依赖项管理器(如composer)来解决此冲突,方法是将X包含在与A和B兼容的版本中,或者如果无法解决冲突则显示错误.
现在,许多PHP应用程序允许用户只需上传预先捆绑的包并将其提取到特定的插件目录即可安装插件.
如果A和B是这样的预捆绑插件并且两者都带有他们自己的库X版本,我们可能会遇到问题,因为没有依赖管理器可用于为我们选择兼容的X或在没有的情况下显示错误.
为了防止由于PHP无法将库X以不同版本加载两次到同一名称空间而导致的任何此类冲突,我们可以将A的X和B的X放入不同的名称空间(这可能很难自动完成我们需要一个PHP解析器...).
我的问题是:
没有改变代码就没有解决方案.如果文件系统中确实存在两个版本的'\ Vendor\AnyClass',并且执行代码以同时使用它们,则会出现错误,因为不允许重新声明该类,或者因为期望的类不兼容.它只有在类的接口实现相同时才有效,即两个代码是兼容的.如果不仅是一个类,而是整个对象树可能对来自不同版本的混合类反应很差,即使它们提供兼容的接口,兼容性问题也很复杂.
更改命名空间正在改变代码.谁对此负责?我可以想到一些能够为每个插件添加特定命名空间前缀的自动代码解析器,但是我的PHP知识还没有完成该任务.我公司的Java人员发表了一些评论,说这个问题已经解决了,但我没有细节.
此外,它使您的代码库加倍,并且重复的代码只能共享您拥有的一个操作码缓存.
我知道Wordpress的核心开发人员仍然在努力解决这个问题.关于如何使用Composer进行依赖关系管理(即插件及其依赖关系),有一些编码建议,但我认为他们现在没有取得足够的进展.
基本上你有两个选择:1.创建一个代码名称空间前缀,解析属于一个插件的所有文件(所以插件作者必须以某种方式包含他的依赖项),更改代码,使用代码重复,看看等待你的是什么在调试方面.缺点是该插件之外的任何代码都不能直接使用插件代码,因为这意味着知道创建的前缀.2.实现某种形式的依赖关系管理,最好使用Composer,而不要更改命名空间.
更新:我再次咨询了我的Java同事,他们基本上做了关于Java的关于PHP的相同声明:你不能在同一个类名下有两个不同版本的类,并且即使对于Java但将类重命名为不同的命名空间.
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |