2016-02-15 39 views
1

在下面這個簡單的模擬PHP類中,我有兩種將JavaScript文件添加到頁面的方法。如何從父類繼承的子類PHP類將值添加到父類數組屬性中?

目標是在我的應用程序插件系統中使用此插件,以便將擴展此類PluginCore類的用戶插件將能夠調用一個函數,允許它們將JavaScript文件從那裏插入到主應用程序中。

PluginCore有一個數組$this->jsFilesArray,它用於存儲應該包含在頁面中的所有JavaScript文件。

有一個setter方法來向這個數組添加新的JS文件。

還有一種方法將遍歷數組,並將每個JavaScript文件插入到帶有腳本標記的頁面中。


我現在的問題是,我怎麼能允許從PluginCore類擴展任何插件類是能夠以某種方式到達那裏加入到父類JS文件$this->jsFilesArray陣列,這樣當核心類插入文件到頁面,它會包含任何調用某種函數來添加文件的插件JS文件?

我的一個想法是使用WordPress風格的插件/鉤子功能,以便插件基本上會調用一個從PluginCore類觸發的鉤子並將JS文件插入到頁面中。子插件會簡單地鉤入該動作事件。

這種方法可行,但我希望找到其他方法來實現我想要的結果以進行學習,並測試不同的方法。

另一個想法是讓子插件有一個addJsFile()函數,該函數在調用時會爲該插件返回一個JS文件數組。然後,父類可以在子類上調用此方法,併爲每個插件執行此操作,同時將所有這些方法的結果組合到一個數組中,並將其傳遞給PluginCore類。

那麼我該如何做到這一點?


模擬類代碼給出它可能看起來像什麼?

class PluginCore { 

    public $jsFilesArray = array(); 


    public function __construct() { 
    $this->addJsFile('jsFileCOre1', 'http://file-path-url-to-js-file/jsfilecore1.js'); 
    } 



    public function addJsFile($jsFileKey, $jsFileUrl) { 
    if(! isset($this->jsFilesArray[$jsFileKey])){ 
     $this->jsFilesArray[$jsFileKey] = $jsFileUrl; 
    } 
    } 



    public function loadJsFilesIntoDom() { 
    foreach($jsFiles as $fileKey => $fileValue){ 
     echo '<script type="text/javascript" src="'.$fileValue['fileUrl'].'"></script>\n'; 
    } 
    } 

} 

回答

1

的一種方法是使它static

class PluginCore { 

    public static $jsFilesArray = array(); 


    public function __construct() { 
     self::addJsFile('jsFileCOre1', 'http://file-path-url-to-js-file/jsfilecore1.js'); 
    } 



    public static function addJsFile($jsFileKey, $jsFileUrl) { 
     if(! isset(self::$jsFilesArray[$jsFileKey])){ 
      self::$jsFilesArray[$jsFileKey] = $jsFileUrl; 
     } 
    } 



    public function loadJsFilesIntoDom() { 
     foreach(self::$jsFilesArray as $fileKey => $fileValue){ 
     echo '<script type="text/javascript" src="'.$fileValue['fileUrl'].'"></script>\n'; 
    } 
    } 

} 

class PluginShell extends PluginCore { 

    public function __construct() { 
     self::addJsFile('jsFileShell1', 'http://file-path-url-to-js-file/jsfileshell1.js'); 
    } 



} 

$core = new PluginCore(); 
$shell = new PluginShell(); 

var_dump(PluginCore::$jsFilesArray); 
var_dump(PluginShell::$jsFilesArray); 

這樣$jsFilesArray不綁定到類,但類本身的實例,所以你不必擔心之間的通信兩個班。

但您可能想了解何時使用靜態方法(以及何時不使用)。 HereIonuţG. Stan的答案非常有趣,如果您想要去的方式不是你想要的方式,可以幫助你進一步與你的課程。

+0

謝謝,我甚至沒有考慮過這個選項,直到現在! – JasonDavis