2013-06-04 10 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()を呼び出す2つの異なる方法の違いは何ですか? 私が考えることができる唯一の違いは、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

parent ::の代わりにparentClass :: myMethod()を使用しても警告は出ませんが、全体的な考え方があります。:: operatorを使って継承するクラスからメソッドを呼び出すと、それは特別なケースです。ありがとう。 – user2339681

+0

@ user2339681 E_STRICTエラーが発生しました。エラー報告を高くすると、それが表示されます。 – bwoebi

5

この場合も違いはありません。 は、親クラスと子クラスの両方がmyMethodを実装している場合に違いがあります。この場合、$this->myMethod()は現在のクラスの実装を呼び出し、parent::myMethod()はメソッドの親の実装を明示的に呼び出します。 parent::は、特殊な呼び出しのための特別な構文です。静的呼び出しとは関係ありません。間違いなく醜い、混乱している。

https://stackoverflow.com/a/13875728/476を参照してください。

関連する問題