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