在PHP插件中包含第三方库时避免类名冲突的模式?

时间:2015-09-18 18:11:11

标签: php wordpress plugins

我正在编写一个WordPress插件。 (但是,这不是特定于WordPress的问题 - 这个挑战可能出现在使用插件模式的任何 PHP代码库中。)

我的插件使用了一个流行的第三方库,许多其他常见的WordPress插件也使用它。

显然,如果我的插件和另一个插件都加载了这个库的副本,那么PHP会抛出错误,因为我试图重新声明已经声明的类。

如何避免这种冲突?在你回答之前,请考虑为什么我拒绝了这些明显的选择:

  • 我可以重命名库的类,或者将它们放在新的命名空间中。我不喜欢这样,因为它涉及修改库文件。如果我以后需要升级到更新版本的库,它将覆盖我的修改。而且它通常只是一个不优雅的PITA。

  • 在我的插件实际包含库之前,我可以使用class_exists()来确保它已经包含在内。两个

    • 另一个插件可能会使用具有稍微不同的API的库的不同版本。这可能导致我的插件或其他插件中断(取决于首先加载库的哪个版本)。
    • 更重要的是:有问题的库包含多个类定义文件,每个子类包含其父类。假设我的插件包含ChildClass1.php(反过来包括BaseClass.php),另一个插件包含ChildClass2.php(包含自己的BaseClass副本.PHP)。 class_exists()在这里对我没有帮助 - 两个插件都不能包含他们需要的ChildClasses而不会引起冲突。

那么:如何在不遇到其中一个问题的情况下使用这个库?有没有办法在包含时覆盖库的命名空间(不修改库)?还有其他一些我忽略的解决方案吗?这似乎是一种非常常见的情况。

1 个答案:

答案 0 :(得分:0)

我在回答自己的问题。 (我不敢相信我只有三年前才这么天真!)

(除其他外)这个问题正是依赖管理器存在的原因。 (如果您使用npm,那么您已经熟悉依赖管理。)

在PHP世界中,Composer是依赖性管理的标准工具。

但是,WordPress并不是真正能够与依赖项管理器(或源代码管理器)配合使用。实际上,WordPress积极地反对 这些做法。

有一个名为Bedrock的项目,该项目试图将WordPress扭曲为与现代开发实践兼容的项目。我没有使用过-但是如果您必须使用WordPress,则值得进行调查。

tl; dr:

  • 解决此问题的方法是使用依赖项管理器,例如Composer。
  • 但是,WordPress完全与Composer不兼容-它会在每一个步骤中与您抗争,并且您将制造出更多无法解决的问题。
  • 除非您使用Bedrock的WordPress版本- 设计为可与Composer配合使用。
  • 但是,在那时,您不如放弃WordPress,而采用首先经过精心设计的CMS平台,并且不必被扭曲和折磨以与行业合作-标准做法。