我对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)
http://www.php.net/manual/en/language.oop5.visibility.php
这个例子输出
Bar::testPrivate
Foo::testPublic
Run Code Online (Sandbox Code Playgroud)
请问你能解释一下这是怎么回事吗?
为什么两个testPublic()都不叫?
我把一个var_dump($this)Bar类构造.它打印object(Foo)[1].我所知道的是私有属性可以用同一个类调用.
然后如何Bar::testPrivate调用" "?
然后如何调用"Bar :: testPrivate"?
当你调用时$myFoo->test(),它会在上下文中运行代码,Bar因为Foo类没有覆盖它.
在内部Bar::test(),当$this->testPrivate()被调用时,解释器将Foo首先查看,但该方法是私有的(并且无法从中调用来自后代类的私有方法Bar),因此它会向上一级,直到找到合适的方法; 在这种情况下,这将是Bar::testPrivate().
相反,当$this->testPublic()被调用时,解释器立即找到合适的方法Foo并运行它.
编辑
为什么testPublic()都没有被调用?
运行时只调用一个方法$this->testPublic(),最远的一个方法(就基于距基类的距离而言).
如果Foo::testPublic()还需要执行父实现,则应该parent::testPublic()在该方法内部编写.
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |