当两个插件包含相同的第三方类时会发生什么?

时间:2016-02-24 作者:Tony DeStefano

我正在构建一个插件,使用Stripe进行支付处理。我已经将Stripe的PHP库包含到我的插件中,一切都很好。但如果其他人制作的插件也使用Stripe。。。或者更糟糕的是,旧版本的Stripe与我的不兼容?如果有人同时激活了我们的两个插件,听起来可能会有冲突。

我需要为Stripe的类命名名称空间吗?这样做明智吗?如果我想升级到Stripe库的更新版本,我想这将是一场维护噩梦。

我完全可以这样做,但我想确保我在这里遵循最佳实践。

谢谢托尼

2 个回复
SO网友:Tony DeStefano

我继续,给Stripe命名。一切都很顺利。现在我不用担心别人的条纹库把我的东西弄乱了。

原件:

namespace Stripe;
新建:

namespace MyRadNamespace\\Stripe;
如果有人有兴趣了解它是如何完成的,请随时浏览我的回购:

https://github.com/Spokane-Wordpress-Development/Freezy-Stripe

干杯

SO网友:kaiser

当我通过link to the repo 附在回答中,我注意到requice 单个文件中的语句。主要问题是repo缺少一个可以在项目范围内优化的自动加载器,并且插件包括所有这些文件,无论是否需要。

当您开始使用Composer管理附件时,您会发现它会创建一个autoload.php 您编写(或获取)的每个包的文件。然后,您可以使用Composer作为包管理器创建完整的项目,这是一个很好的副作用,还可以创建一个集中的项目autoload.php 文件,而不是每个包含的包(插件/主题/等)一个自动加载器。在这个自动加载器的基础上,Composer还构建了一个“类>文件”映射作为“缓存”,以避免尽可能多的磁盘读取,从而尽可能快地保持类查找。

这将避免必须为供应商命名空间的类命名。这意味着如果多个包具有composer.json 文件,则只有一个位置可以保存这些供应商软件包(从而节省带宽和磁盘空间)并从中提取。即使不忽略VCS控制包中的供应商文件,也无需再加载它们。

# Before in Package (A)
$stripe = new \\MyRadNamespace\\Stripe;
# Before in Package (B)
$stripe = new \\MyFunkyNamespace\\Stripe;

# After – anywhere!
$stripe = new \\Stripe;
如果插件或主题尚不支持Composer,您只需通过WPackagist 代理/镜像服务。

要快速开始使用Composer软件包管理器,我建议使用wecodemore/wpstarter 作者@gmazzap–docs here.