我正在考虑如何在php中实现一个好的插件系统。我读了很多关于挂钩系统和实现这些事情的不同方法,但直到现在我还没有找到任何符合我需求的方法或现有系统。
我希望有一个对象(让它成为$ plugins),其中所有使用过的插件都可用作子对象($ plugin-> $ blog)。到目前为止,这没问题。但是我怎么能抓住一个不存在的插件?
如果代码中的某处我会通过使用$ plugin-> $ blog-> loadArticle或类似的东西来调用插件$ blog,并且插件系统未加载该插件,则会抛出致命错误。是否可以在调试类中捕获并处理这些错误?
感谢您的想法!请原谅我的英文...; - )
答案 0 :(得分:2)
好吧,您可以使用magic __get()
实现这样的插件对象class Plugins {
private $plugins = array();
public function __get($name) {
if (!isset($this->plugins[$name]) {
throw new PluginNotInstalledException(); //this can be catched with try / catch
}
return $this->plugins[$name];
}
... //methods addPlugin() etc..
}
答案 1 :(得分:0)
每当您设置$blog
属性时,最好检查传递的参数是否为=== NULL
,如果是这种情况则抛出异常。因此,您将确保$plugin->blog
不为空。
如果你的插件必须实现一个接口或继承一个抽象类,那就更好了。那么每当你设置一个属性时,你可以检查传递的参数是instanceof
那个类/接口。
答案 2 :(得分:0)
一种简单的方法是提供getPlugin()方法。
function getPlugin($plugin)
{
if(! isset($this->$plugin)) return false;
return $this->$plugin;
}
$blog = $plugins->getPlugin('blog');
if($blog === false)
{//error condition
}