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

如何在PHP中编写简单的插件支持?,php,plugins,extensibility,Php,Plugins,Extensibility,我目前正在为自己编写一个小PHP应用程序,我想为它添加一个简单的插件扩展性 我确实找到了一些关于如何做到这一点的想法,但我觉得它们对我的需求来说都太复杂了 让我解释一下我到底需要什么: 我的应用程序应该执行一项简单的任务,例如:执行web搜索。 用户应该能够选择使用哪个插件。 例如,您可以选择Google、Yahoo和Bing插件。 每个插件都有一个函数“performWebSearch”,返回搜索结果。 是的,基本上就是这样 我可以向您展示我当前使用的代码,以便更清楚地说明: 要获取现有插件的

我目前正在为自己编写一个小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)
    {
        // ...
    }
}
这样做是可行的,但这样做会让人感觉“肮脏”。
我相信有一种更好的方法可以做到这一点,但我不知道它可能是什么

非常感谢您的帮助。

谢谢。

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


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

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

将插件文件命名为Search[Name].php和Search classes Search[Name],其中[Name]是一个类似谷歌的搜索引擎

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

include "your_folder/$engineName_search.php";
创建搜索对象并执行搜索:

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

您基本上是在描述一种常见的软件模式。如前所述,不应使用您的解决方案,而
\uu autoload()
无疑是一条可行之路。您基本上想要的是一个接口,它公开您的“插件”应该遵循的API。您的实现(“插件”)实现了该接口。一个简单的工厂(或者更好的,via)实例化所需的类并执行它。看一看,例如,寻找灵感你知道我如何在不包含插件的情况下获得所有可用插件的名称和版本吗?有什么方法可以做到这一点吗?实际上,你应该使用一个数据库(或文件),其中描述了所有插件,这样,如果插件产生错误,你就可以轻松地停用它们,你不需要删除或移动文件,你仍然可以通过访问控制来访问它们。