从父类扩展的子 PHP 类如何将值添加到父类数组属性上


How can a child PHP class which extends from a parent class, add values on to the parent classes array property?

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

目标是在我的应用程序插件系统中使用它,以便将扩展下面这个PluginCore类的用户插件将能够调用一个函数,允许他们将那里插件中的 JavaScript 文件包含在主应用程序中。

PluginCore有一个数组$this->jsFilesArray用于存储应包含在页面中的所有JavaScript文件。

有一个 setter 方法可以将新的 JS 文件添加到此数组。

还有一种方法将迭代数组并使用脚本标签将每个 JavaScript 文件插入到页面中。


我现在的问题是,我如何允许从类扩展PluginCore插件类能够以某种方式到达添加到父类$this->jsFilesArray数组中的 JS 文件,以便当核心类将文件插入页面时,它将包含任何插件 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';
    }
    }
}

一种方法是使其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就不会绑定到类的实例,而是绑定到类本身,因此您不必担心两个类之间的通信。

但是您可能需要了解何时使用静态方法(以及何时不使用(。在这里,Ionuț G. Stan的答案非常有趣,如果不是你想走的路,static可能会帮助你进一步上课。