子类的子项中没有JPlugin属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子类的子项中没有JPlugin属性相关的知识,希望对你有一定的参考价值。
我正在写一个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
。
有人可以对这里发生的事情有所了解吗?
答案
您禁止使用构造函数初始化插件。如果在子类中使用构造函数,则应始终显式调用父构造函数。
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
。
以上是关于子类的子项中没有JPlugin属性的主要内容,如果未能解决你的问题,请参考以下文章