2013-06-04 38 views
7

說我有一個父類

class parentClass { 
    public function myMethod() { 
     echo "parent - myMethod was called."; 
    } 
} 

和下面的子類

class childClass extends parentClass { 
    public function callThroughColons() { 
     parent::myMethod(); 
    } 
    public function callThroughArrow() { 
     $this->myMethod(); 
    } 
} 

$myVar = new childClass(); 
$myVar->callThroughColons(); 
$myVar->callThroughArrow(); 

使用兩種不同方式從繼承類中調用myMethod()有什麼區別? 我能想到的唯一區別是,如果childClass用他自己的版本覆蓋myMethod(),但還有其他顯着差異嗎?我認爲雙冒號操作符(::)應該只用於調用靜態方法,但是當調用$ myVar-> callThroughColons()時,即使啓用了E_STRICT和E_ALL,我也不會收到任何警告。這是爲什麼?

謝謝。

回答

3

self::,parent::static::是特例。他們總是表現得好像你會做一個非靜態的調用,並且支持靜態方法調用而不拋出E_STRICT

當您使用類的名稱而不是那些相對標識符時,您只會遇到問題。

那麼什麼工作是:

class x { public function n() { echo "n"; } } 
class y extends x { public function f() { parent::n(); } } 
$o = new y; 
$o->f(); 

class x { public static function n() { echo "n"; } } 
class y extends x { public function f() { parent::n(); } } 
$o = new y; 
$o->f(); 

class x { public static $prop = "n"; } 
class y extends x { public function f() { echo parent::$prop; } } 
$o = new y; 
$o->f(); 

但什麼都不行是:

class x { public $prop = "n"; } 
class y extends x { public function f() { echo parent::prop; } } // or something similar 
$o = new y; 
$o->f(); 

您仍然必須使用$this明確解決屬性問題。

+0

即使我使用parentClass :: myMethod()而不是parent ::,但我沒有得到任何警告,但我得到了總體思路 - 使用::運算符從繼承類調用方法並不真正生成靜態調用,這是一個特例。謝謝。 – user2339681

+0

@ user2339681您收到E_STRICT錯誤。當您將錯誤報告更高時,您會看到它。 – bwoebi

5

在這種情況下,它沒有區別。它確實如果父母和孩子類實現myMethod有所作爲。在這種情況下,$this->myMethod()調用當前類的實現,而parent::myMethod()顯式調用父方法的實現。 parent::是這種特殊類型調用的特殊語法,它與靜態調用無關。這可以說是醜陋和/或令人困惑。

請參閱https://stackoverflow.com/a/13875728/476

相關問題