我在
PHP OOP手册
http://www.php.net/manual/en/language.oop5.visibility.php中看到了这个,我无法理解为什么输出不是:Foo :: testPrivate Foo :: testPublic
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(); // Bar::testPrivate
// Foo::testPublic
这完全取决于变量/方法的可见性.
您会注意到在Bar类中,方法testPrivate()是私有的.这意味着ONLY本身可以访问该方法.没有小孩.
所以当Foo扩展Bar,然后要求运行test()方法时,它会做两件事:
>它覆盖了testPublic()方法,因为它是公共的,并且Foo有权使用它自己的版本覆盖它.
>它在Bar上调用test()(因为test()仅存在于Bar()上).
testPrivate()没有被重写,并且是包含test()的类的一部分.因此,打印了Bar :: testPrivate.testPublic()被重写,并且是继承类的一部分.因此,打印Foo :: testPublic.