请告诉我原因:
class ClassOne {
protected $a = 10;
public function changeValue($b) {
$this->a = $b;
}
}
class ClassTwo extends ClassOne {
protected $b = 10;
public function changeValue($b) {
$this->b = 10;
parent::changeValue($this->a + $this->b);
}
public function displayValues() {
print "a: {$this->a}, b: {$this->b}\n";
}
}
$obj = new ClassTwo();
$obj->changeValue(20);
$obj->changeValue(10);
$obj->displayValues();
打印a: 30
和b: 10
。
我希望得到精心回应。谢谢:))
旁注:这实际上是我查看的一个考试题目,并不太明白。感谢您的回复。
答案 0 :(得分:4)
我不知道如何总结这个执行,除了“它正在执行你写的逻辑”。
我已在每次调用中添加评论以显示中间步骤:
$obj = new ClassTwo(); // a = 10, b = 10
$obj->changeValue(20); // Sets b = 10, a = 20 (a = 10 + 10 = 20)
$obj->changeValue(10); // Sets b = 10, a = 30 (a = 20 + 10 = 30)
^
Previous value of a
$obj->displayValues();
你可能会对此感到困惑:
public function changeValue($b) {
$this->b = 10;
parent::changeValue($this->a + $this->b);
}
因为永远不会将$b
分配给任何内容。因此,传递给changeValue
的内容并不重要,当您拨打30, 10
两次时,您将始终获得changeValue
。
E.g。 :
$obj->changeValue(0);
$obj->changeValue(0);
仍会输出a: 30 and b: 10
答案 1 :(得分:4)
传递给changeValue()
的参数未使用。
对该方法的每次调用都会导致添加$this->a + $this->b
,但您永远不会在分配给a
或b
时使用传入的值,或者在添加时使用它。
基本上每次拨打changeValue()
都会向$this->a
添加10。
答案 2 :(得分:3)
我不知道你的期望,但请注意ClassTwo-> changeValue不使用$ b参数...(我相信有人会说这不是答案,而且它不是但是,它应该是一个足够大的暗示来解决问题。)
答案 3 :(得分:1)
public function changeValue($b) {
$this->b = 10;
parent::changeValue($this->a + $this->b);
}
$ this-> b != $ b作为changeValue函数的参数 也许这让你很困惑。