从父类扩展而来的子PHP类如何向父类数组属性添加值?

从父类扩展而来的子PHP类如何向父类数组属性添加值?,php,Php,在下面这个简单的模拟PHP类中,我有两种方法可以将JavaScript文件添加到页面中 我们的目标是在我的应用程序插件系统中使用它,这样将扩展下面的PluginCore类的用户插件将能够调用一个函数,允许他们将JavaScript文件从该插件包含到主应用程序中 PluginCore有一个数组$this->jsFilesArray,用于存储页面中应包含的所有JavaScript文件 有一个setter方法可以将新的JS文件添加到此数组中 还有一种方法可以遍历数组并将每个JavaScript文件插入

在下面这个简单的模拟PHP类中,我有两种方法可以将JavaScript文件添加到页面中

我们的目标是在我的应用程序插件系统中使用它,这样将扩展下面的
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';
    }
    }

}
类插件核心{
public$jsFilesArray=array();
公共函数构造(){
$this->addJsFile('jsFileCOre1','http://file-path-url-to-js-file/jsfilecore1.js');
}
公共函数addJsFile($jsFileKey,$jsFileUrl){
如果(!isset($this->jsFilesArray[$jsFileKey])){
$this->jsFilesArray[$jsFileKey]=$jsFileUrl;
}
}
公共函数loadJsFilesIntoDom(){
foreach($jsfileas$fileKey=>$fileValue){
回音'\n';
}
}
}

一种方法是使其成为静态的:

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=array();
公共函数构造(){
self::addJsFile('jsFileCOre1','http://file-path-url-to-js-file/jsfilecore1.js');
}
公共静态函数addJsFile($jsFileKey,$jsFileUrl){
if(!isset(self:$jsFilesArray[$jsFileKey])){
self::$jsFilesArray[$jsFileKey]=$jsFileUrl;
}
}
公共函数loadJsFilesIntoDom(){
foreach(self:$jsFilesArray作为$fileKey=>$fileValue){
回音'\n';
}
}
}
类PluginShell扩展了PluginCore{
公共函数构造(){
self::addJsFile('jsFileShell1','http://file-path-url-to-js-file/jsfileshell1.js');
}
}
$core=新的PluginCore();
$shell=新的PluginShell();
变量转储(PluginCore:$jsFilesArray);
变量转储(PluginShell:$jsFilesArray);
通过这种方式,
$jsFilesArray
不绑定到类的实例,而是绑定到类本身,因此您不必担心两个类之间的通信


但您可能想了解何时使用静态方法(何时不使用)。IonuțG.Stan的答案非常有趣,如果
static
不是您想要的方式,它可能会帮助您进一步学习。

谢谢,直到现在我才考虑过这个选项!