子类的子项中没有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属性的主要内容,如果未能解决你的问题,请参考以下文章

UIView 的子类没有视图属性

如何隐藏其子项被隐藏的菜单?

如何将 View 类中的代码片段移动到 OnAppearing() 方法?

创建自己的代码片段(CodeSnippet)

单继承&多继承 注意点

oop 中的属性查找顺序,派生 覆盖