在PHP中卸载动态类

MrG*_*MrG 7 php

我通过以下方式实现了动态加载插件:

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)

PluginPluginInterface定义ie时提供一些有用的功能process().

我假设所有插件都名为PlginImpl的事实导致了问题,因此我的问题是:有没有办法PlginImpl在加载后卸载class()require_once?或者我应该采用完全不同的方法?


编辑 我试过没有成功完成以下事情:

  • 取消设置$plginprocess()
  • 调用__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)