这个问题与昨天的问题密切相关。
我想要实现的目标:在php中一个完美的面向对象的插件系统,我可以通过这种方式访问插件:
$plugins->testplugin->dosomethingcool();
我得到了什么:在一些帮助下,我设法解决了第一个基本问题。我想到的第一个问题是,使用这种结构,一个不存在的插件会给整个系统带来致命的错误。所以我必须处理这些错误。实际上,我有这个课程:
<?php
class pluginmanager {
// Simplyfied everything here...
// Basically this class catches the fatal error for calling an object, that has not been defined
public function __get($name) {
if (!isset($this->$name)) {
try{
throw new Exception(...);
}
catch(Exception $e){
// Do something with the exception
}
// Make sure to handle a "Call to member function a non-object"-error.
// The object beneath will use __call() for the error catch.
$this->$name= new DummyPlugin();
}
return $this->$name;
}
}
?>
到现在为止,这将有效,并允许我拥有基于对象的插件管理器。我现在意识到,例如可能的插件“博客”将不得不使用其他插件“数据库层”。有没有办法让这成为可能?
我已经想到了:
在加载所有插件后,我不能进行依赖检查,并为每个插件提供它所依赖的所有插件的引用吗?这个参考文献是一个完整的副本还是它会在单词意义上保留一个参考?
感谢您的想法!