Php WordPress插件开发中的编写器命名空间冲突

Php WordPress插件开发中的编写器命名空间冲突,php,wordpress,composer-php,Php,Wordpress,Composer Php,我遇到了一个完全可以预测但令人难以置信的恼人和难以解决的问题 我一直致力于开发WordPress插件的PHP框架。它使用Composer进行依赖关系管理。当然,问题是如果您在同一个WordPress安装中有两个my framework实例,您有两个供应商文件夹,以及框架所需的任何软件包的两个副本。这导致了一个错误 该框架作为一个单独的插件,然后由构建在其上的任何应用程序/插件继承 将供应商文件夹移动到核心框架文件夹? 问题:如果有两个composer.json文件和两个composer.phar

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

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

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

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

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


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

我不太熟悉Composer或您正在使用的插件框架,但一般来说,在WordPress插件中避免函数/类名冲突的方法如下:

  • 假设您的插件(例如MyCoolPlugin)是面向对象编写的,例如作为名为MyCoolPlugin的类,您可以将helper类/库作为MyCoolPlugin的子类

  • ,这是PHPs查找类是否已定义的方法。假设您的助手类满足以下条件:

类MyHelperClass{
}

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

if(!class_exists('MyHelperClass')){
   class MyHelperClass{
   }
}
当然,这里有一个折衷,因为只有类的第一个实例将在WordPress中使用。例如,如果您有两个插件,其中包含两个不同版本的helper类,那么在任何给定时刻,只有一个插件处于活动状态并可用

  • 一个全局变量-例如
    define('MY\u HELPER\u已加载',true)(如果您通过
    include()
    require()
    包含它们)。然后在每个包含的助手文件的开头,检查
    if(defined('MY\u helper\u IS\u LOADED'))返回值,这将导致不包括当前请求的包含/要求文件

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

Composer实际上并不打算在同一个项目中多次使用。另一方面,它也并没有什么严重的问题,但您失去了它的依赖项特性,需要将其视为WordPress环境中依赖项的一般情况

换言之,如果您不以依赖项编写器的方式编写依赖项,而WordPress根本不执行依赖项,那么如何处理它就成了您个人的问题

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


我不明白为什么供应商文件夹会是相同的,如果你使用多个作曲家安装。。。您能详细说明一下您是如何构建它的,它是供公共还是供私人使用的吗?

为什么您首先需要两个供应商?只需编辑主
vendor
文件夹的
composer.json
文件,逐个添加所需的依赖项。删除composer.lock文件,然后再次运行
php composer.phar install
。将更新自动加载器,并将所有依赖项添加到主供应商目录。如果名称冲突,请使用前缀,或者根据需要手动编辑或更改文件。您只需复制这些没有可用repo的依赖项(即您自己的依赖项)@jdp:为什么不为composer使用wordpress插件安装程序?然后,您不仅有一个中央供应商文件夹,还可以使用composer安装插件。如果您仅将composer用作子基础结构,那么这将无法正常工作。因此,至少要寻找定制安装程序:-----如果你加入wordpress stackexchange循环聊天,你可能会遇到Rarst how,他对这个主题了解很多。是的。我正在构建的东西被其他插件扩展。这些子插件可以在他们的项目中实现Composer。所以,如果两个子插件都包含,比如说,小树枝,它就会断开。我很想知道如果两个插件都使用同一个供应商文件夹,并在某种程度上合并它们的依赖项列表,它是否会起作用。使用同一个供应商文件夹显然是个坏主意,文件树会不匹配,自动加载程序扫描错误的东西,等等。在正常的Composer安装中,自动加载程序可能会堆叠,最早的会“赢”和服务冲突类,但任何非命名空间函数都会像往常一样出现致命错误,因为它们不会自动加载。如上所述-您唯一的选择是执行自己的检查和防错逻辑。