如何将类私下导入到插件中?

时间:2013-07-07 作者:halfer

我编写了一个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+,但这是我最不喜欢的解决方案;我内心的纯粹主义者对类名的腐败感到畏缩!

有经验的插件作者会采取什么方法?

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

Use namespaces, 但是check the PHP version 在服务器端,如果不满足要求,则使用有用的错误消息停用插件。

如果你看看official statistics, 您可以看到有多少安装仍在过时的WordPress版本上运行。但是几乎所有的新插件都需要最新的WordPress版本,没有人对此抱怨。我认为那里有大量废弃或管理不善的设施。无论如何,他们可能永远不会使用你的插件。

这使得您只需要少量的最新安装,但仍在PHP 5.2上。他们可以升级。现在所有的网络主机都提供这种功能,但他们不能run Symfony 或者其他最流行的脚本。

另一种选择是将库移动到单独的插件,并要求首先安装该库。然后hook into library_loaded 启动专用插件的代码。

结束