我通过以下方式实现了动态加载插件:
function processplugin( $plgFile,$db ) { require_once( $plgFile ); $plgin = new PlginImpl(); $plgin->setDb($db); $ret = $plgin->process(); return $ret; }
每个插件定义一个名为PlginImpl的类,它可以正常工作.但是应该可以在process()的返回值内调用指定的其他插件.这会调用上面指定的相同方法,但失败的是:
Fatal error: Cannot redeclare class PlginImpl in ..
请注意,每个插件都是一个类,即:
class PlginImpl extends Plugin implements PluginInterface
Plugin提供了一些有用的功能,而PluginInterface定义了ie().
我假设所有插件都名为PlginImpl的事实导致问题,因此我的问题是:有没有办法在用require_once加载它后卸载一个类(PlginImpl)?或者我应该采用完全不同的方法?
编辑
我试过没有成功完成以下事情:
>进程后取消设置$plgin()
>调用__destruct() – 它既不在processplugin()中也不在process方法中有效
非常感谢!
由于您在加载类后无法卸载它,因此您唯一的选择是重命名每个插件.
PluginX,PluginY等,但它应该无关紧要,因为您可以强制它们使用插件界面,如您所示.
要加载一个特定的插件,你可以简单地使用solomongaby建议的东西,但不是文件名,而是传递插件的名称..这样的东西:
function loadplugin($pluginName) { require_once $pluginName . '.PHP'; $plugin = new $pluginName; //do whatever with $plugin }