【问题标题】:JPlugin properties not available in child of child classJPlugin 属性在子类的子类中不可用
【发布时间】:2018-03-03 05:14:30
【问题描述】:

我正在编写一个 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-&gt;params 为空,我直接在 PlgUserMyPluginParent 中设置并尝试从 MyPluginChild 访问的任何属性也是如此。

例如,如果我在 PlgUserMyPluginParent 中声明:

public $myParentClassProperty = "somevalue";

然后尝试使用 $this-&gt;myParentClassProperty 从 MyPluginChild 访问它,它返回 null

有人可以解释一下这里发生了什么吗?

【问题讨论】:

  • 对此进行更正:public MyParentClassProperty = "somevalue";应该是 public $MyParentClassProperty = "somevalue";它实际上可以使用 $this->MyParentClassProperty 从 MyPluginChild 访问。但 $this->params 不是。

标签: plugins joomla php-7


【解决方案1】:

您禁止使用构造函数初始化插件。 如果您在子类中使用构造函数,则应该始终显式调用父类的构造函数。

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

【讨论】:

  • 谢谢尼布拉。目前 PlgUserMyPluginParent 没有构造函数,所以当我运行该代码时,我得到“调用未定义的方法 PlgUserMyPluginParent::construct()”。如果我在 PlgUserMyPluginParent 中放置一个构造函数,则 onUserAfterLogin 方法不会触发。
  • 您的PlgUserMyPluginParent 扩展自JPlugin,它具有 构造函数。请仔细检查。
  • 我已经做了一些挖掘工作。父类是 CMSPlugin,它是一个抽象类,它确实包含一个构造函数。据我了解,当 PlgUserMyPluginParent 被实例化时,它继承了设置 $params 的构造函数。如果我在 PlgUserMyPluginParent(或 CMSPlugin)中声明一个属性并在声明时为其分配一个值,则它在 MyPluginChild 中可用。但是,如果我在 PlgUserMyPluginParent 中设置该属性,则它在 MyPluginChild 中不可用。说实话,我的项目不再需要这个了,它只是让我烦恼!
猜你喜欢
  • 2014-10-27
  • 2021-03-13
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多