我不确定这是否可能,但现在开始。我想从子类中设置受保护变量的值,然后从父类访问该值。这就是我尝试过的:
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
特定的内容之前,首先调用父构造函数。