在下面的这个简单的模拟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
可能会帮助你进一步上课。