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


How to write simple plugin support in PHP?

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

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

让我解释一下我到底需要什么:
我的应用程序应该做一个简单的任务,例如:执行web搜索。
用户应该能够选择使用哪个插件。
例如,你可以有一个谷歌,雅虎和必应插件可供选择。
每个插件都有一个返回搜索结果的函数"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)
    {
        // ...
    }
}

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

谢谢你的帮助。谢谢。

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

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

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

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

命名插件文件Search[Name].php和搜索类Search[Name],其中[Name]是一个搜索引擎,如Google

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

include "your_folder/$engineName_search.php";

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

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