2012-06-28 10 views
58

最初に、両方のメソッドがコンストラクタの呼び出しを呼び出す理由が混乱していましたが、今は理解していると思います。拡張するクラスは、親クラスのメソッドをクラス自体で宣言されているかのように継承し、メソッドは親クラスに存在するので、両方とも機能するはずです。複数の方法で親メソッドをPHPで呼び出す

ここでは、メソッド呼び出し(parentまたはthis)を使用する方法(つまりベストプラクティス)があるかどうか、これらが真に同じコードを実行する方法であるかどうかどちらか一方を使用する場合の注意点

申し訳ありませんが、私はおそらくこれを考えています。

abstract class Animal { 

    function get_species() { 

     echo "test"; 

    } 

} 

class Dog extends Animal { 

    function __construct(){ 

     $this->get_species(); 
     parent::get_species(); 

    } 

} 

$spike = new Dog; 

答えて

77

あなたは親クラスのメソッドが終了サブクラスでメソッドを呼び出します3つのシナリオ(私は考えることができること)があります。方法は、サブクラスによって上書きされない

  1. 、だけで存在するが、親。

    これはあなたの例と同じですが、一般的には$this -> get_species();を使用する方が良いでしょう。この場合、2つは事実上同じですが、メソッドはサブクラスによって継承されているため、区別する必要はありません。 $thisを使用すると、継承されたメソッドとローカルに宣言されたメソッドの間で一貫性が保たれます。

  2. メソッドはサブクラスによって上書きされ、親から完全にユニークなロジックを持ちます。

    $this -> get_species();の場合は、親バージョンのメソッドを実行しないようにしてください。再び、$thisを一貫して使用することで、このケースと最初のケースの区別について心配する必要はありません。

  3. メソッドは親クラスを拡張し、親メソッドが達成するものに追加します。

    この場合、サブクラスの他のメソッドからメソッドを呼び出す場合でも、`$this -> get_species();を使用します。親メソッドを呼び出す1つの場所は、親メソッドを上書きするメソッドからのものです。例:

    abstract class Animal { 
    
        function get_species() { 
    
         echo "I am an animal."; 
    
        } 
    
    } 
    
    class Dog extends Animal { 
    
        function __construct(){ 
    
         $this->get_species(); 
        } 
    
        function get_species(){ 
    
         parent::get_species(); 
         echo "More specifically, I am a dog."; 
        } 
    } 
    

彼らは二つの異なるものを行なったし、あなたがの親のバージョンを必要と知っていた場合は、オーバーライドするメソッドの外で直接親メソッドを呼び出す必要がありますどこ私は想像することができる唯一のシナリオは次のようになりメソッドではなく、ローカルである。これがケースではありませんが、それ自体存在しなかった場合、これにアプローチするきれいな方法は、それがない、すべてが親メソッドを呼び出すですget_parentSpecies()のような名前を持つ新しいメソッドを作成するには、次のようになります。

function get_parentSpecies(){ 

    parent::get_species(); 
} 

この場合も、すべてが素敵で一貫性があり、親メソッドに頼るのではなく、ローカルメソッドを変更/変更することができます。

+0

私はそれを "伸ばす"なしでやるだろうか?私は親クラスの "人間"の機能は必要ないので、クラス "人間"の中にいくつかのクローズ "レッグ"がありますが、実際にはそれを拡張する必要はありません。今、私が '$ leg = new leg()'を 'human'の中に作成したら、足のインスタンス' $ leg'の内部から人間の関数をどう呼び出すことができますか? – user151496

+0

@ user151496脚は人間のサブクラスではありません。人間は多くの脚を持っていますが、脚は人間の一種ではありません。したがって、脚は人間ではないので、人間から継承する脚のクラスを持つべきではありません。 – Beetle

+0

LegをLeggyのインターフェイスを持つクラスにしますか?それとも人間のクラスがLeggyを実装しているのですか?どのようにして脚は人間に排他的ではなく、人間の脚は独特の人間であり、人間の一般的な性質であるということをどのように定義するのが最適でしょうか? – Anthony

5

私は質問を誤解していない限り、それはそれを拡張しないので(この場合は犬で)サブクラスはこのメソッドを上書きする可能性があるため、私はほとんど常にます$ this-> get_speciesを使用します。クラス犬がメソッドを再定義しない場合、両方の方法が機能的に同等ですが、将来のある時点で、犬のget_speciesメソッドで "dog"を出力したい場合は、すべてのコードをそれを変更。

$ thisを使用すると、実際には作成したオブジェクトの一部なので、常に最新のものになります(使用されているプロパティがオブジェクトの寿命中に何らかの形で変更された場合)親クラスを使用して静的クラスメソッドを呼び出しています。

+0

これは、メソッドをオーバーライドしたい場合に備えて、$ thisを使用することについての良い点です。ありがとう – jerry