【发布时间】:2011-04-14 23:18:34
【问题描述】:
考虑以下代码:
class foo {
private function m() {
echo 'foo->m() ';
}
public function call() {
$this->m();
}
}
class bar extends foo {
private function m() {
echo 'bar->m() ';
}
public function callbar() {
$this->m();
}
}
$bar = new bar;
$bar->call();
$bar->callbar();
现在,更改 m() 方法的可见性,我得到:
(+ 为 public,- 为 private)
Visibility bar->call() bar->callbar()
======================================================
-foo->m(), -bar->m() foo->m() bar->m()
-foo->m(), +bar->m() foo->m() bar->m()
+foo->m(), -bar->m() ERROR ERROR
+foo->m(), +bar->m() bar->m() bar->m()
(protected 似乎表现得像 public)。
我期待一切都像声明 public 时一样。但是尽管foo->call() 和bar->callbar() 本质上是相同的,但它们会产生不同的结果,具体取决于m() 在foo 和bar 中的可见性。为什么会这样?
【问题讨论】:
-
结果第三行播放不同,我的是foo->m() bar->m(),没有出现错误
-
为了澄清,这里是您的第三个案例的链接stackoverflow.com/questions/18010637/…
-
foo::call() 和 bar::callbar() 不是一回事。他们有不同的范围。范围定义是否可以调用私有方法。可以这样想:私有方法是类的一个实现细节,所以只有该类内部的代码才能调用它。
标签: php overriding private visibility