我正在编写一个WordPress插件。 (但是,这不是特定于WordPress的问题 - 这个挑战可能出现在使用插件模式的任何 PHP代码库中。)
我的插件使用了一个流行的第三方库,许多其他常见的WordPress插件也使用它。
显然,如果我的插件和另一个插件都加载了这个库的副本,那么PHP会抛出错误,因为我试图重新声明已经声明的类。
如何避免这种冲突?在你回答之前,请考虑为什么我拒绝了这些明显的选择:
我可以重命名库的类,或者将它们放在新的命名空间中。我不喜欢这样,因为它涉及修改库文件。如果我以后需要升级到更新版本的库,它将覆盖我的修改。而且它通常只是一个不优雅的PITA。
在我的插件实际包含库之前,我可以使用class_exists()
来确保它已经包含在内。有两个我不喜欢这个选项的理由:
class_exists()
在这里对我没有帮助 - 两个插件都不能包含他们需要的ChildClasses而不会引起冲突。那么:如何在不遇到其中一个问题的情况下使用这个库?有没有办法在包含时覆盖库的命名空间(不修改库)?还有其他一些我忽略的解决方案吗?这似乎是一种非常常见的情况。
答案 0 :(得分:0)
我在回答自己的问题。 (我不敢相信我只有三年前才这么天真!)
(除其他外)这个问题正是依赖管理器存在的原因。 (如果您使用npm,那么您已经熟悉依赖管理。)
在PHP世界中,Composer是依赖性管理的标准工具。
但是,WordPress并不是真正能够与依赖项管理器(或源代码管理器)配合使用。实际上,WordPress积极地反对 这些做法。
有一个名为Bedrock的项目,该项目试图将WordPress扭曲为与现代开发实践兼容的项目。我没有使用过-但是如果您必须使用WordPress,则值得进行调查。
tl; dr: