0

我正在努力思考如何在 php 中实现一个好的插件系统。我读了很多关于挂钩系统和实现这些东西的不同方法的文章,但直到现在我还没有找到任何适合我需要的方法或现有系统。

我想要一个对象(让它成为 $plugins),其中所有使用的插件都可以作为子对象($plugin->$blog)。到目前为止,这没有问题。但是我怎么能捕捉到一个不存在的插件呢?

如果在代码中的某个地方我会使用 $plugin->$blog->loadArticle 或类似的东西调用插件 $blog 并且插件系统没有加载插件,则会引发致命错误。是否可以在调试类中捕获和处理这些错误?

谢谢你的想法!请原谅我的英语...... ;-)

4

3 回答 3

2

好吧,您可以使用魔术 __get() 像这样实现您的 Plugin 对象

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..
}
于 2013-04-24T18:18:58.803 回答
0

每当您设置$blog属性时,最好检查传递的参数是否为=== NULL,如果是则抛出异常。所以你会确定它$plugin->blog不为空。

如果您的插件必须实现接口或继承抽象类,那就更好了。因此,每当您设置属性时,您都可以检查传递的参数是否instanceof是该类/接口。

于 2013-04-24T18:19:09.707 回答
0

一个简单的方法是提供一个 getPlugin() 方法。

function getPlugin($plugin)
{
  if(! isset($this->$plugin)) return false;

  return $this->$plugin;
}

$blog = $plugins->getPlugin('blog');
if($blog === false)
{//error condition

}
于 2013-04-24T18:22:51.727 回答