如何捕获PHP中不存在的子对象引发的错误?

时间:2013-04-24 18:13:54

标签: php plugins error-handling

我正在考虑如何在php中实现一个好的插件系统。我读了很多关于挂钩系统和实现这些事情的不同方法,但直到现在我还没有找到任何符合我需求的方法或现有系统。

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

如果代码中的某处我会通过使用$ plugin-> $ blog-> loadArticle或类似的东西来调用插件$ blog,并且插件系统未加载该插件,则会抛出致命错误。是否可以在调试类中捕获并处理这些错误?

感谢您的想法!请原谅我的英文...; - )

3 个答案:

答案 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

}