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

gre*_*600 5 php wordpress plugins

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

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

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

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

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

  • 在我的插件实际包含库之前,我可以使用class_exists()它来确保它还没有包含在内.我不喜欢这个选项有两个原因:

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

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

gre*_*600 0

我正在回答我自己的问题。(我不敢相信三年前我还是这个na\xc3\xafve!)

\n\n

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

\n\n

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

\n\n

然而,WordPress 并不是真正为了与依赖管理器(或源代码控制)很好地配合而构建的。事实上,WordPress 正在积极对抗做法。

\n\n

一个名为Bedrock的项目,它试图将 WordPress 扭曲成与现代开发实践兼容的东西。我还没有使用它 \xe2\x80\x93 但如果你必须使用WordPress,那么它值得研究。

\n\n

长话短说:

\n\n
    \n
  • 这个问题的解决方案是使用依赖管理器,例如 Composer。
  • \n
  • ,WordPress 根本与 Composer 不兼容 \xe2\x80\x93\xc2\xa0 它会在每一步中与你作斗争,并且你会制造比你解决的问题更多的问题。
  • \n
  • 除非您使用 WordPress \xe2\x80\x93\xc2\xa0 的 Bedrock 版本,该版本旨在与 Composer 配合使用。
  • \n
  • 但是,到那时,您不妨放弃 WordPress,并采用一个 CMS 平台,该平台首先经过合理设计 \xe2\x80\x93,并且不必经过扭曲和折磨才能与行业合作 -标准做法。
  • \n
\n