我很难理解为什么我们得到此代码的输出:
<?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();
?>
因此,Foo扩展了Bar。 $ myfoo是Foo类的一个对象。 Foo没有称为test()的方法,因此它从其父Bar扩展了它。但是为什么test()的结果是
Bar::testPrivate
Foo::testPublic
您能解释一下为什么当父级方法在子级中被覆盖时,第一个为什么不是Foo::testPrivate吗?
提前非常感谢您!
最佳答案
顾名思义,可能是因为testPrivate
是一个私有(private)方法,不会被类继承所继承/覆盖。
在php.net手册页上,您可能从中获得了该代码,明确指出了We can redeclare the public and protected method, but not private
因此,实际发生的情况如下:子类将不会重新声明方法testPrivate
,而是仅在子对象的情况下才在“作用域”中创建其自己的版本。由于在父类中定义了test()
,它将访问父类testPrivate
。
如果您要在子类中重新声明test
函数,则该函数应访问childs的? testPrivate()
方法。
关于php - 继承和可见性-PHP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13044281/