4

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

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

-- 首先 -- :
获取所有插件文件的方法,以index表示插件主文件的单词开头(ig 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)

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

4

1 回答 1

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);
     }
}
于 2012-09-25T07:53:11.427 回答