0

请告诉我为什么:

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: 30b: 10.

我将不胜感激。谢谢 :)

附带说明:这实际上是我看过的一个考试问题,但不太明白。谢谢你的回复。

4

4 回答 4

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, 10changeValue

例如:

$obj->changeValue(0); 
$obj->changeValue(0);

还是会输出a: 30 and b: 10

于 2012-04-30T22:13:29.323 回答
4

传递给的参数changeValue()未使用。

对该方法的每次调用都会导致添加$this->a + $this->b,但您永远不会在分配a或添加时使用传入的值b

基本上每次调用都会changeValue()增加 10 到$this->a.

于 2012-04-30T22:15:21.203 回答
3

我不知道您期望什么,但请注意 ClassTwo->changeValue 不使用 $b 参数...(我敢肯定有人会说这不是答案,也不是,但是它应该是一个足够大的提示来找出问题。)

于 2012-04-30T22:15:56.697 回答
1
public function changeValue($b) {
    $this->b = 10;
    parent::changeValue($this->a + $this->b);
  }

$this->b != $b 作为 changeValue 函数的参数 也许这让你感到困惑。

于 2012-04-30T22:15:42.323 回答