我很难理解为什么我们得到这段代码的输出:
<?php
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test();
?>
Run Code Online (Sandbox Code Playgroud)
所以Foo扩展了Bar.$ myfoo是Foo类的一个对象.Foo没有一个叫做test()的方法,所以它从它的父Bar扩展它.但是为什么test()的结果是
Bar::testPrivate
Foo::testPublic
Run Code Online (Sandbox Code Playgroud)
你能解释一下为什么第一个不是Foo :: testPrivate,当这个父方法在孩子中被覆盖时?
非常感谢你提前!
Lou*_*uer 12
也许监守testPrivate,随着名字已经表明,一个私有方法,并不会被继承/由类继承覆盖.
在php.net手册页上,您可能会从中明确地说明了该代码 We can redeclare the public and protected method, but not private
因此,具体如下:子类不会重新声明该方法testPrivate,而是仅在子对象的情况下在"范围"中创建自己的版本.正如test()在父类中定义的那样,它将访问父类testPrivate.
如果要重新声明test子类中的函数,它应该访问childs ? testPrivate()方法.
除了声明类之外,任何其他方法都不会看到私有方法.由于您testPrivate从父类调用,它可以访问的唯一方法是它自己的方法声明.这样你就得到了你看到的输出.protected但是,如果有访问修饰符,那么您将获得预期的输出,因为受保护的方法在整个继承链中都是可见的.
因为private手段private.没有其他课程,甚至没有孩子班级知道Bar::testPrivate(),因此不能覆盖他们甚至不知道的事情.
你Foo::testPrivate()只能在里面使用Foo.因为这private就是全部.
更多信息:覆盖私有方法时的奇怪行为