102

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

parentここで、メソッドを(またはを介して)呼び出すための好ましい方法(つまり、ベストプラクティス)があるthisかどうか、これらが同じコードを実行するための本当に同じ方法であるかどうか、または1つを使用するときに注意事項があるかどうか疑問に思っています。もう1つ。

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

abstract class Animal {

    function get_species() {

        echo "test";

    }

}

class Dog extends Animal {

    function __construct(){

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

    }

}

$spike = new Dog;
4

2 に答える 2

138

メソッドが親クラスで終了するサブクラスでメソッドを呼び出す場合、(私が考えることができる) 3 つのシナリオがあります。

  1. メソッドはサブクラスによって上書きされず、親にのみ存在します。

    これはあなたの例と同じであり、一般的には使用する方$this -> get_species(); が適切です。この場合、2つは事実上同じですが、メソッドはサブクラスによって継承されているため、区別する理由はありません。を使用$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();
}

繰り返しますが、これによりすべてが適切で一貫性が保たれ、親メソッドに依存するのではなく、ローカル メソッドへの変更/修正が可能になります。

于 2012-06-28T03:34:53.080 に答える
7

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

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

于 2012-06-28T03:09:24.130 に答える