我很难尝试理解以下代码的输出:
class Bar
{
public function test() {
$this->testPublic();
$this->testPrivate();
}
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::testPublic
Bar::testPrivate
Class Foo 会覆盖 testPublic()和 testPrivate(),并继承 test()。当我调用 test()时,有一个显式指令包含 $ this 伪变量,所以在我创建 $ myFoo 实例后,最终调用 test()函数将是 $ myFoo-> testPublic()和 $ myFoo-> testPrivate()。第一个输出正如我所料,因为我重写 testPublic()方法以回显 Foo :: testPublic 。但第二个输出对我来说毫无意义。如果我覆盖 testPrivate()方法,为什么 Bar :: testPrivate ?根据定义,无论如何也不会继承父类的私有方法!这没有道理。为什么父方法被称为???
答案 0 :(得分:5)
您的代码存在的问题是方法Bar::testPrivate
为private
,因此子类无法覆盖它。对于初学者,我建议您阅读PHP中的可见性 - http://www.php.net/manual/en/language.oop5.visibility.php。在那里,您将了解到只能覆盖public
和protected
类成员方法/属性,private
不能覆盖。{/ p>
举个好例子,尝试将Bar::testPrivate
方法的可见性更改为public或protected,而不更改示例代码中的任何其他内容。现在尝试运行测试。怎么了?这样:
PHP致命错误:Foo :: testPrivate()的访问级别必须受到保护(如在类Bar中)或更弱
最大的问题是:“为什么?”好吧,您现在已使用私有Bar::testPrivate
覆盖Foo:testPrivate
。这个新的私有方法超出了Bar::test
的范围,因为私有类成员只对其当前类可见, NOT 父/子类!
因此,正如您所看到的,OOP为类成员提供了一定量的封装,如果您没有花时间去理解它,可能会非常混乱。