PHP Access公共变量在子类中受到限制

时间:2018-02-14 15:18:39

标签: php oop

如何在使用__construct的Parent类设置的Child类中访问公共属性?

例如:

class Parent
{
    protected $pVariableParent = 'no info'; //This have to be set for all classes

    public function __construct()
    {
        $this->setPVariable(); //Changing the property when class created.
    }

    public function setPVariable(){
        $this->pVariableParent = '123';
    }
}

Class Child extends Parent
{
    public function __construct()
    {
        if(isset($_GET['info']){
            echo $this->pVariableParent;
        }
    }
}

$pInit = new Parent;
$cInit = new Child;

在此状态下,请求site.php/?info会显示no info。但如果我从Child调用$this->setPVariable();,则一切正常并显示123。为什么我无法从Parent访问已更改的属性?是因为当我调用Child类时,它只是读取所有父类的属性和方法,但是没有触发任何构造函数?什么是最好的方法呢?感谢名单。

1 个答案:

答案 0 :(得分:3)

问题是你覆盖了父构造函数,所以在子构造函数中没有调用setPVariable

扩展父构造函数而不是覆盖:

Class Child extends Parent
{
  public function __construct()
    {
      parent::__construct();
      if(isset($_GET['info']){
        echo $this->pVariableParent;
    }
  }
}

http://php.net/manual/it/keyword.parent.php

让我试着澄清一点:

  

为什么我无法从Parent访问已更改的属性?

因为该属性尚未更改。您正在创建两个单独的对象; $pInit是父类的实例,其属性值在构造函数中更改。 $cInit是子类的实例,其属性值未更改,因为您重写构造函数并且子类不更改属性值。$pInit$cInit不相关(除了按类型),它们肯定不会影响彼此的内部结构。