在插件系统中包含插件文件的正确方法是什么

时间:2012-09-24 12:59:18

标签: php plugins include

我已经创建了一个插件系统,我已经在该系统中创建了所有内容,但是,如何包含插件文件来执行它。

我试图创建一个方法,其中包含插件文件来执行它。

- 首先 - :
获取所有插件文件的方法,以index字开头,表示插件的主文件(i.g.index-pluginName.php),并将路径和文件名添加到数组中。

public function getPluginFiles($plugin_folder) {
  $dir = opendir($plugin_folder);
  while ($files = readdir($dir)) {
     if ($files == '.' || $files == '..')
        continue;

     if (is_dir($plugin_folder.'/'.$files))
        $this->getPluginFiles($plugin_folder.'/'.$files);


     if (preg_match('/^[index]+/i', $files)) {
        $this->plugins_path[$plugin_folder.'/'.$files] = $files;
     }
  }
  closedir($dir);       
}

- 其次 - :
包含要执行的所有插件主文件的方法,此方法从先前创建的数组中获取插件文件的路径和名称。

public function includePlugFiles() {
   $this->getPluginFiles($this->plugin_folder);
   foreach ($this->plugins_path as $dir=>$file) {
     include_once (dirname($dir)."/".$file);
   }
}

另请参阅插件文件中存在的代码示例:

function test() {
    echo " This is first plugin <br/>";
}

$plugin->addHook('top', test); // parameters(top=position, test=callback)

现在,当我创建一个对象的实例作为这个表单时。

$plugin = new plugin;
$plugin->includePlugFiles();

但毕竟是这样,显示错误信息

Fatal error: Call to a member function addHook() on a non-object in .... projects\plugins\index-test.php on line 7

这是第7行的代码:

$plugin->addHook('top', test); // parameters(top=position, test=callback)

我知道问题发生的原因是,不会创建对象。 并且问题是无法在每个主插件文件中创建对象。

1 个答案:

答案 0 :(得分:0)

这可能不是最干净的解决方案,但您可以这样做,而不是尝试引用$plugin符号(超出插件文件的范围):

$this->addHook('top', test);

或者,您可以在includePlugFiles()方法中明确创建引用:

public function includePlugFiles()
{
     $plugin = $this;

     $this->getPluginFiles($this->plugin_folder);
     foreach ($this->plugins_path as $dir=>$file) {
         include_once (dirname($dir)."/".$file);
     }
}