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

--secondly-:
実行するプラグインのすべてのメインファイルを含むメソッド。このメソッドは、前に作成した配列からプラグインファイルのパスと名前を取得します。

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 に答える