【问题标题】:How to avoid duplicate API classes?如何避免重复的 API 类?
【发布时间】:2015-10-19 03:59:40
【问题描述】:

我试图在我的 Wordpress 插件中包含 commonly used API 并遇到重复的类错误。我尝试使用 class_exists() 检查,但无法控制插件加载的顺序,另一个插件(不检查 class_exists)在我之后加载,然后 WP 崩溃。

我考虑过编辑 API 类并添加一个相对独特的前缀。我也考虑过更新它以使用命名空间。但是,从长远来看,维护 3rd 方代码的更改似乎并不理想。

有没有办法在不直接编辑 API 代码的情况下完成此操作?为 API 类创建一个命名空间的包装器怎么样?

更新:

我看到其他几个人也有同样的问题。在过去的一个月里,我一直在阅读有关最佳实践的信息,但仍然没有找到任何好的建议。我的软件现在使用了几个可能发生冲突的 API,因为其他插件编写者不检查 class_exists。我不能直接编辑到 namespace 所有这些第 3 方 API,因为有些 API 非常大/复杂,我觉得必须有更好的选择。

我仍然很好奇是否有办法为第 3 方 API 类创建命名空间的包装器。或者如果有其他想法,我很想听。

【问题讨论】:

  • yup namespace 它并向该存储库提交拉取请求!!!
  • 你遇到了什么错误?
  • @MatthewD 我得到了白屏死机。如果我注释掉 API 包含或禁用其他插件(使用相同的 API),那么一切正常。
  • 您如何将 API 包含/加载到您的插件中?
  • 实例化我的主插件类时,我有一个加载包含的函数。我在这里使用 require_once() 加载 API。例如, require_once MY_PLUGIN_DIR 。 'includes/api/GetResponseAPI.class.php';

标签: php wordpress namespaces


【解决方案1】:

PHP 中的类名被硬编码到源文件中。这包括命名空间。

这实际上是 PHP 在 PHP 5.3 中引入命名空间特性的原因,这样同名类可以驻留在自己的命名空间中,以防止类名冲突(您可以看到致命错误和死机白屏) .

对于您遇到的问题,您无能为力。原始库需要命名空间。如果该库的上游供应商无法提供该库,则一种选择是您可以分叉该库并自己完成工作。然后,您可以考虑将您的更改作为拉取请求提供回原始项目,以便每个人都可以从您的更改中受益(并且将来的更改可以更容易地从上游集成到您的副本中)。

但是,当这总是关于同一个类(来自同一个库)时,那么您只是遇到了 wordpress 插件的问题:由于 wordpress 中没有具有自动加载功能的共享库(嗯,wordpress 核心可能是这样看来,只是没有自动加载),如果某个类在多个插件之间共享,则每个插件必须检查是否需要加载某个类。如果只有一个插件行为不端,您将看到您遇到的崩溃。在这种情况下,您需要修复这些插件并将问题报告给插件供应商。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2021-08-17
    相关资源
    最近更新 更多