让我们牢记这两个美丽的课程!
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”。 嗯,为什么?
答案 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
请确保给出正确的结果