WordPress插件开发中的Composer命名空间冲突

jdp*_*jdp 10 php wordpress composer-php

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

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

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

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

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

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

Rar*_*rst 7

Composer并不是真的意味着在同一个项目中多次使用.另一方面,它也没有什么特别的错误,但是你失去了它的依赖特性,需要像在WordPress环境中那样对待依赖的一般情况.

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

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

如果你使用多个作曲家安装,我不会理解为什么供应商文件夹是相同的...你能详细说明你如何构建它,它是否适合公共或私人使用?


Dzh*_*eyt 0

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

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

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

class MyHelperClass{ }

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

if(!class_exists('MyHelperClass')){
   class MyHelperClass{
   }
}
Run Code Online (Sandbox Code Playgroud)

当然,这里需要权衡,因为只有该类的第一个实例才会在我们的 WordPress 中使用。例如,如果您有两个具有两个不同版本的帮助程序类的插件 - 在任何给定时刻只有其中一个会处于活动状态并可用。

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

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