当类继承类时,方法重写如何工作?

时间:2018-09-03 17:36:36

标签: php class object inheritance override

让我们牢记这两个美丽的课程!

class Bar 
{
    public function test() {
        echo "<br>";
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublicn";
    }

    private function testPrivate() {
        echo "Bar::testPrivaten";
    }

    public function ShowBar() {
        $this->testPrivate();
    }
}

class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublicn";
    }

    private function testPrivate() {
        echo "Foo::testPrivaten";
    }

    public function ShowFoo() {
        $this->testPrivate();
    }
} 
$myFoo = new Foo();
$myFoo->test();

echo "<br>"; 
$myFoo->ShowBar();

echo "<br>"; 
$myFoo->ShowFoo(); 

有人愿意解释什么是输出值以及为什么吗?

我正在关注此代码... 它显示“ Bar :: testPrivatenFoo :: testPublicn”!为什么? 我如何看待此输出? 公共方法被重载,私有方法未被重载。

好,所以我希望ShowBar()会输出“ Bar :: testPrivaten” 它输出“ Bar :: testPublicn”,很好。

好,所以我希望ShowFoo()会输出“ Bar :: testPrivaten” 但实际上输出“ Foo :: testPublicn”。 嗯,为什么?

1 个答案:

答案 0 :(得分:1)

下面的代码将触发Bar类中的test()方法,因为您不会覆盖Foo类中的test()方法

$myFoo = new Foo();
$myFoo->test();

因此,此方法将从Bar类中触发

public function test() {
    echo "<br>";
    $this->testPrivate();
    $this->testPublic();
}

当您调用$ this-> testPrivate()时,它将打印Bar的testPrivate()为 Bar :: testPrivaten,因为私有方法是类的私有方法,不能被覆盖

接下来,您调用$ this-> testPublic()。由于您已经在Foo类中重写了此方法,因此它将比Bar触发Foo的testPublic()方法。因此它将打印 Foo :: testPublicn

所以你最终会变成 Bar :: testPrivatenFoo :: testPublicn

但是这不可能发生

Ok, so ShowBar() I would expect will output "Bar::testPrivaten" It outputs "Bar::testPublicn", great.
Ok, so ShowFoo() I would expect will output "Bar::testPrivaten" but it actually outputs "Foo::testPublicn".

我刚刚测试了您的代码并获得了以下内容

Bar::testPrivatenFoo::testPublicn
Bar::testPrivaten
Foo::testPrivaten

请确保给出正确的结果