2012-06-13 37 views
1

請看下面給出的代碼。php5 ---方法可見性問題

<?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(); // Bar::testPrivate 
       // Foo::testPublic 
?> 

在上面的例子中,當我們呼籲$myFoo->test();它所謂的Bar class testPrivate但怎麼就叫做FootestPublic

任何人都可以幫助我嗎?

回答

0

因爲測試()不是美孚和酒吧範圍運行。酒吧範圍不能訪問Foo私人方法。 只需添加試驗(+),以富...

+0

那麼爲什麼它可以訪問Foo的testPublic(),因爲testPublic of foo不在Bar範圍內? –

+0

PHP嘗試訪問儘可能。 Foo只是擴展Bar :: test()而不是複製它!所以test()運行在它的所有者範圍內(Bar),但是當PHP試圖儘可能地訪問方法時,它使用Foo :: testPublic(),它存在且可訪問FOR Bar,但testPrivate不可訪問FOR Foo ... – AHHP

0

事實上知名度頁面上的一個評論確實重申這一點:

「私有方法從來沒有參加中壓倒一切的,因爲這些方法在不可見孩子班「。

它確實感覺有點奇怪,因爲你會認爲子類會覆蓋父方法名是相同的,但它不是私有方法的情況下,父母方法在這裏需要注意,所以最好使用如果您想覆蓋,請使用受保護的方法