我正在编写一个Joomla用户插件(Joomla 3.8和PHP 7.0),我在继承方面遇到了一些麻烦。子类可以使用以下命令访问父项的属性和方法:
$this->[propertyormethod]
但......
<?php
defined('_JEXEC') or die;
class PlgUserMyPluginParent extends JPlugin
{
public function onUserAfterLogin($options = array())
{
$MyPluginChildObj = new MyPluginChild;
}
}
class MyPluginChild extends PlgUserMyPluginParent
{
public function __construct()
{
var_dump($this->params);
die;
}
}
在上面,当用户完成登录时,方法onUserAfterLogin()
按预期激发。
因为$params
是由JPlugin设置的,而PlgUserMyPluginParent扩展了JPlugin,所以我可以访问PlgUserMyPluginParent类的方法中的$params
(和其他JPlugin属性):
$this->params
到目前为止一切顺利。但是当我使用MyPluginChild扩展PlgUserMyPluginParent时,$this->params
为null,我在PlgUserMyPluginParent中直接设置并尝试从MyPluginChild访问的任何属性也是如此。
例如,如果我在PlgUserMyPluginParent:
中声明public $myParentClassProperty = "somevalue";
然后尝试使用$this->myParentClassProperty
从MyPluginChild访问它,它会返回null
。
有人可以了解这里发生的事情吗?
答案 0 :(得分:0)
您禁止使用构造函数初始化插件。 如果在子类中使用构造函数,则总是显式调用父构造函数。
class MyPluginChild extends PlgUserMyPluginParent
{
/**
* Constructor
*
* @param object $subject The object to observe
* @param array $config An optional associative array of configuration settings.
* Recognized key values include 'name', 'group', 'params', 'language'
* (this list is not meant to be comprehensive).
*/
public function __construct($subject, $config = [])
{
parent::construct($subject, $config);
var_dump($this->params);
die;
}
}
然后JPlugin的构造函数有机会填充$params
。