我编写了一个Wordpress插件,它利用我编写的一个简单的控制器/模板库,将业务逻辑与表示分离开来。我有一个(稍微有点理论性的)问题,就是如何以与其他插件用法不冲突的方式将这个“私下”导入插件。
图书馆,叫做TemplateSystem
, 是我的git repo中插件的子模块,内部定义如下:
<?php
// Don\'t define this if it\'s already been defined
if (!class_exists(\'TemplateSystem\'))
{
abstract class TemplateSystem
{
...
}
}
因此,如果另一个插件使用
TemplateSystem
, 将使用加载的副本,而不是通过重新定义它来创建错误。正常情况下可以,但现在
TemplateSystem
引入了向后不兼容的更改。
因此,我需要同时加载同一个库的两个版本。目前,要么新的库会破坏旧的插件,要么旧的库会破坏新的插件,这取决于WP加载插件的顺序。
所以,这里有一个潜在的变化TemplateSystem
这就解决了问题:
<?php
// The \'Change2\' part would change with backwards incompatible changes,
// rather than just version numbers (although that would be fine tbh)
namespace TemplateSystem\\Change2;
// Don\'t define this if it\'s already been defined
if (!class_exists(\'TemplateSystem\\Change2\\TemplateSystem\'))
{
abstract class TemplateSystem
{
...
}
}
为了避免用例中的名称冲突,我可以这样做:
<?php
use TemplateSystem\\Change2\\TemplateSystem as VersionedCommentsTemplateSystem;
class VersionedCommentsController extends VersionedCommentsTemplateSystem
{
...
}
与旧版本(无名称空间)配合使用,效果很好。现在,我提到这个问题是理论性的,因为我是模板库的作者,并且(尽管它是公开的),我认为没有其他人在使用它。因此,一个解决方案是忽视这个问题;然而,知道如何正确处理它会很好!
第二种可能性:除了名称空间需要PHP 5.3之外,上面的名称空间解决方案可以很好地工作,而且正如本网站上的各种答案所显示的那样,WP不会很快从不推荐的版本中删除。我是否应该忽略这一点,并要求PHP 5.3,即使核心没有移动?这当然会阻止任何基于我工作的插件在旧服务器上运行。
或者,如果您认为插件(及其库)最好只需要5.2.4,那么有什么替代修复方案?我在考虑一个捆绑的PHP控制台“build”脚本,它只需进行一些简单的搜索和替换,这样库名就会被每个插件的自定义名称替换;因此TemplateSystem.php
文件被复制,副本的类定义在内部重命名为VersionedCommentsTemplateSystem
(即根据用例)。这有点骇人,但至少可以在更多的安装中使用。
最后,在类名中添加更改或版本号:
<?php
// Don\'t define this if it\'s already been defined
if (!class_exists(\'TemplateSystem2\'))
{
abstract class TemplateSystem2
{
...
}
}
这将适用于5.2.4+,但这是我最不喜欢的解决方案;我内心的纯粹主义者对类名的腐败感到畏缩!
有经验的插件作者会采取什么方法?