子类

时间:2018-03-03 05:14:30

标签: plugins joomla php-7

我正在编写一个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

有人可以了解这里发生的事情吗?

1 个答案:

答案 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