2013-01-16 41 views
3
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 

我很難理解這個輸出。有人能夠給我一個清楚簡潔的解釋發生了什麼?我正在學習OOP,並想知道如何使用擴展來覆蓋父類的功能。難以理解如何在擴展類中聲明父類的函數?

回答

5

test()方法調用2種方法:

  1. testPublic - 這是一個公共之一,因此它在Foo覆蓋。所以Foo::testPublic被稱爲
  2. testPrivate - 這是一個私人的,所以它只對每個類本身可見。對於主叫方法(這是Bar) - 這是一個Bar::testPrivate

所以 - 如果方法是publicprotected - 它可以被覆蓋,並從祖先/孩子叫;如果它是private - 它不能。

0

$ this引用當前對象。所以當你做下面的事情。

$ this-> testPublic();

它將調用testPublic()來實現該功能的頂部最一流的。

如果你只想調用父類,那麼有父關鍵字。

parent :: testPublic();

這將調用testPublic()上的類下面的當前對象。

完全不要將 - >運算符與::運算符混淆。

::運算符引用定義一個對象,其中as - >引用對象的實例。

self::testPublic(); 
$foo::testPublic(); 

引用一個名爲testPublic()的靜態函數,並在類級別定義靜態方法。

$foo->testPublic(); 
$this->testPublic(); 

引用的函數作爲對象的實例的一部分,且有用來查找哪個對象實例級別應該被稱爲虛函數表。

+1

'parent :: method()'。 'parent->'在語法上是錯誤的 – zerkms

+0

我的不好。謝謝。 – cgTag