如何在PHP中编写简单的插件支持?

时间:2014-08-02 20:55:45

标签: php plugins extensibility

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

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

让我解释一下我到底需要什么:
我的应用程序应该执行一个简单的任务,例如:执行Web搜索 用户应该能够选择使用哪个插件 例如,您可以选择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)
    {
        // ...
    }
}

这很有效,但感觉很脏"这样做。
我确信有更好的方法可以做到这一点,但我不知道它可能是什么。

我感谢任何帮助 感谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

将插件文件命名为搜索[名称] .php 和搜索类搜索[名称] ,其中[name]是 Google <等搜索引擎/ em>的。

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

include "your_folder/$engineName_search.php";

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

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