从父类扩展而来的子PHP类如何向父类数组属性添加值?
在下面这个简单的模拟PHP类中,我有两种方法可以将JavaScript文件添加到页面中 我们的目标是在我的应用程序插件系统中使用它,这样将扩展下面的从父类扩展而来的子PHP类如何向父类数组属性添加值?,php,Php,在下面这个简单的模拟PHP类中,我有两种方法可以将JavaScript文件添加到页面中 我们的目标是在我的应用程序插件系统中使用它,这样将扩展下面的PluginCore类的用户插件将能够调用一个函数,允许他们将JavaScript文件从该插件包含到主应用程序中 PluginCore有一个数组$this->jsFilesArray,用于存储页面中应包含的所有JavaScript文件 有一个setter方法可以将新的JS文件添加到此数组中 还有一种方法可以遍历数组并将每个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
不是您想要的方式,它可能会帮助您进一步学习。谢谢,直到现在我才考虑过这个选项!