10

我遇到了一个完全可预测但令人难以置信且难以解决的问题。

我一直在研究用于开发 WordPress 插件的 PHP 框架。它使用 Composer 进行依赖管理。当然,问题是如果您在同一个 WordPress 安装中有我的框架的两个实例,您有两个供应商文件夹,以及框架所需的任何包的两个副本。这会导致错误。

该框架作为一个单独的插件运行,然后由构建在其上的任何应用程序/插件继承。

将供应商文件夹移动到核心框架文件夹?

问题:我不知道如果我有两个 composer.json 文件和两个 composer.phar 文件写入同一个供应商文件夹并使用同一个自动加载器会发生什么。估计不会好。除此之外,它并没有解决与作曲家包冲突的问题,这些包可能被我试图处理的任何其他脚本或插件使用。

所以我被困住了。这是一个可以解决的问题,还是只是 PHP 固有的问题?

4

2 回答 2

7

Composer 并不是真的要在同一个项目中多次使用。另一方面,它也没有什么大问题,但是您失去了它的依赖项功能,需要将其视为 WordPress 环境中依赖项的一般情况。

换句话说——如果你没有以 Composer 的方式做依赖,而 WordPress 根本没有做依赖,那么如何处理它就成了你个人的问题。

我不知道如果我有两个 composer.json 文件和两个 composer.phar 文件写入同一个供应商文件夹并使用同一个自动加载器会发生什么

如果您使用多个作曲家安装,我没有理解为什么供应商文件夹会相同...您能否详细说明您的结构以及它是供公共还是私人使用的?

于 2013-08-14T08:36:38.280 回答
0

我对 Composer 或您正在使用的插件框架不是很熟悉,但总的来说 - 避免 WordPress 插件中的函数/类名冲突是通过以下方式完成的:

  • 假设您的插件(例如 MyCoolPlugin)是面向对象编写的,例如作为一个名为 MyCoolPlugin 的类,您可以将辅助类/库作为 MyCoolPlugin 的子类包含在内。

  • class_exists(),这是 PHP 查找是否已定义类的方法。假设您的助手类如下:

class MyHelperClass{ }

在每个插件中声明类之前,您可以使用以下检查:

if(!class_exists('MyHelperClass')){
   class MyHelperClass{
   }
}

当然,这里有一个权衡,因为只有类的第一个实例将通过我们的 WordPress 使用。例如,如果您有两个具有两个不同版本的辅助类的插件 - 在任何给定时刻,它们中只有一个会处于活动状态并且可用。

  • 一个全局变量 - 例如define('MY_HELPER_IS_LOADED', true);在帮助文件中(如果您通过include()或包含它们require())。然后在每个包含的帮助文件的开头使用 进行检查if(defined('MY_HELPER_IS_LOADED')) return;,这将导致当前请求的 include/require 文件不被包含。

同样,上述策略通常在 PHP 中使用,我不确定您的插件框架是如何设置的。

于 2013-08-12T15:35:37.583 回答