【问题标题】:What is the right way to include plugins files in plugin system在插件系统中包含插件文件的正确方法是什么
【发布时间】:2012-09-24 12:59:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php plugins include


    【解决方案1】:

    这可能不是最干净的解决方案,但您也可以这样做:

    $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);
         }
    }
    

    【讨论】:

    • 谢谢,您的解决方案非常好,它工作正常。但到目前为止,我不明白它是如何工作的。你能向我解释一下它现在是如何正常工作的吗?
    • 我也将$this-&gt;addHook('top', test); 修改为$plugin-&gt;addHook('top', test); 并且工作正常。这个修饰符有问题吗?
    • @LionKing 当您在脚本顶部添加 error_reporting(-1); ini_set('display_errors', 'On'); 时,为什么它不起作用会变得更加明显;在插件代码文件中没有名为 $plugin 的变量,因为它是在 includePlugFiles() 方法之外定义的。
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2013-03-22
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多