【发布时间】: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