2012-09-24 30 views
4

我創建了一個插件系統,並且我已經在該系統中創建了所有內容,除了我如何包含插件文件來執行它。在插件系統中包含插件文件的正確方法

我試圖創建一個方法,這是做包括插件文件來執行它。

- 首先 - :
是讓所有的插件文件,以及與index字指示插件的主要文件(IG指數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) 

我知道問題發生的原因,該對象將不被創建。 問題是無法在每個主插件文件中創建對象。

回答

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

謝謝,您的解決方案非常好,它工作正常。但到目前爲止,我不明白它是如何工作的。你能否向我解釋它現在如何正確工作? –

+0

另外我修改了'$ this-> addHook('top',test);''到'$ plugin-> addHook('top',test);'並且也能正常工作。這個修飾符有問題嗎? –

+0

@LionKing它會變得更加明顯,爲什麼當你添加'error_reporting(-1); ini_set('display_errors','On');'在腳本的頂部;在插件代碼文件中,沒有稱爲'$ plugin'的變量,因爲它定義在'includePlugFiles()'方法之外。 –