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


Setting protected variable value in child class and accessing value in parent

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

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:

是否可以从子类中设置受保护变量的值,然后在父类中访问该值?如果没有,我将如何做到这一点?

您可以设置值并从子类访问它,而不会有任何问题-实际上,当您在A-类构造函数中生成B-类对象时,您正在执行此操作-但代码的问题是,您正在生成一个父对象,而在该父对象的构造函数中,您生成了子类的新对象。

所以现在发生的是:

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

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