在子类中设置受保护的变量值并在父类中访问值

时间:2013-12-11 00:45:11

标签: php class oop inheritance protected

我不确定这是否可能,但这里有。我想在子类中设置受保护变量的值,然后从父类访问该值。这就是我的尝试:

class A {
    protected $a;

    public function __construct() {
        new B;

        echo "Parent Value: {$this->a}";
    }

    protected function setter($value) {
        $this->a = $value;
    }
}

class B extends A {
    public function __construct() {
        $this->setter('set value');

        echo "Child Value: {$this->a}<br />";
    }
}


new A;

我希望上面代码的输出为:

Child Value: set value
Parent Value: set value

但是我得到以下内容:

Child Value: set value
Parent Value:

是否可以在子类中设置受保护变量的值,然后在父类中访问该值?如果不是,我将如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以设置值并从子类中访问它而不会出现任何问题 - 当您在B - 类构造函数中生成A - 类对象时,实际上是这样做了 - 但问题是使用您的代码就是生成父对象,并在该父对象的构造函数中生成子类的新对象。

所以发生的事情是:

  • 生成A对象,A类的构造函数运行;
  • 在构造函数中生成B对象。 这是一个新对象,与您当前的A对象无关;
  • 您设置值的B对象的构造函数并回显它(基本上回答您自己的问题),输出的第一行是预期的;
  • 继续A对象的构造函数,丢弃生成的B - 类对象并回显$this->a的值,但是没有为该对象设置该值,所以你什么也没得到。

我有点困惑为什么你想在父的构造函数中构造一个子对象。通常我会构造一个B对象,并且在该对象的构造函数中,在执行B特定的东西之前首先调用父构造函数。