1. ホーム
  2. php

[解決済み] php で親メソッドを呼び出す複数の方法

2022-02-10 05:35:34

質問

最初はコンストラクタのメソッド呼び出しが両方とも動作することに戸惑いましたが、今は理解できたような気がします。拡張クラスは親のメソッドを、あたかもそのクラスで宣言されているかのように継承し、そのメソッドは親に存在します。

今、私は、メソッドを呼び出す好ましい方法(つまり、ベストプラクティス)があるかどうか疑問に思っています。 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;

解決方法は?

親クラスで終了するメソッドをサブクラスで呼び出す場合、(私が思いつく限りでは)3つのシナリオがあります。

  1. メソッドがサブクラスで上書きされず、親クラスにのみ存在する。

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

  2. メソッドはサブクラスで上書きされ、親とは全く別のロジックを持つ。

    この場合、明らかに $this -> get_species(); なぜなら、親バージョンのメソッドを実行させたくないからです。 ここでも、一貫して $this この場合、最初のケースとの区別を気にする必要はありません。

  3. メソッドは親クラスを拡張し、親メソッドが実現することを追加します。

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

    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.";
         }
    }
    
    

オーバーライドするメソッドの外側で親メソッドを直接呼び出す必要がある場合、私が想像できる唯一のシナリオは、それらが2つの異なることを行い、ローカルではなく親のバージョンのメソッドが必要であるとわかっている場合です。 このようなことは起こらないはずですが、もしこのようなことが起こった場合は、次のような名前の新しいメソッドを作成するのがきれいな方法でしょう。 get_parentSpecies() このメソッドは、親メソッドを呼び出すだけです。

function get_parentSpecies(){

     parent::get_species();
}

繰り返しますが、これによってすべてがうまく一貫性を保ち、親メソッドに依存することなくローカルメソッドの変更/修正を可能にします。