【问题标题】:How to write simple plugin support in PHP?如何在 PHP 中编写简单的插件支持?
【发布时间】:2014-08-02 20:55:44
【问题描述】:

我目前正在为自己编写一个小的 PHP 应用程序,我想为其添加一个简单的插件可扩展性。

我确实找到了一些关于如何做到这一点的想法,但我觉得它们都太复杂了,无法满足我的需求。

让我解释一下我到底需要什么:
我的应用程序应该执行一项简单的任务,例如:执行网络搜索。
用户应该能够选择使用哪个插件。
例如,您可以选择 Google、Yahoo 和 Bing 插件。
每个插件都有一个返回搜索结果的函数“performWebSearch”。
是的,基本上就是这样。

我可以向您展示我目前使用的代码,以便更清楚:

要获取现有插件的列表:

$classes_before = get_declared_classes();
foreach(glob("../plugins/*.plugin.php") as $filename) include $filename;
$classes_after = get_declared_classes();

foreach($classes_after as $class)
{
    if(!in_array($class, $classes_before))
    {
        $plugins_available[] = $class;
    }
}

这就是“插件”目前的样子:

class google
{
    public $name = "Google Search";
    public $version = 1.0;

    public function performWebSearch($query)
    {
        // ...
    }
}

这可行,但这样做感觉“脏”。
我确信有更好的方法可以做到这一点,但我不知道它会是什么。

感谢您的帮助。
谢谢。

【问题讨论】:

  • 您基本上是在描述一种常见的软件模式。如前所述,不应使用您的解决方案,__autoload() 绝对是要走的路。您基本上想要的是一个接口,该接口公开您的“插件”应符合的 API。您的实现(“插件”)实现了该接口。一个简单的工厂(或者更好的是,通过dependency injection)实例化所需的类并执行它。看看例如Symfony2 寻求灵感。 ;-)

标签: php plugins extensibility


【解决方案1】:

您的解决方案确实很脏,不应该使用。您可以使用__autoload() 函数来加载必要的插件。您可能仍然需要扫描插件目录以查看哪些插件可用,但您应该只加载(包含)必要的插件。

http://ch1.php.net/manual/en/language.oop5.autoload.php

【讨论】:

  • 您知道如何在不包括它们的情况下获取所有可用插件的名称和版本吗?有没有办法做到这一点?
  • 您实际上应该使用描述所有插件的数据库(或文件),这样您可以在它们产生错误时轻松停用它们并且您不需要删除或移动文件和你仍然可以通过做一些访问控制来访问它们。
【解决方案2】:

对于您描述的在哪里编写应用程序和插件的简单系统,这是一个可能的实现:

将插件放在自己的文件夹中。这使得所有插件更容易被识别为不是应用程序基本代码的一部分。

将插件文件命名为 Search[name].php 和搜索类 Search[name],其中 [name] 是像 Google。

假设 $engineName 包含所选引擎的名称,包含匹配插件的文件:

include "your_folder/$engineName_search.php";

创建搜索对象并执行搜索:

$searchClass = "Search$engineName";
$engine = new $searchClass();
$result = $engine->performWebSearch($search);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2023-02-12
    • 1970-01-01
    • 2011-02-17
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多