使用シナリオ
まず、次のコードを確認してください:
abstract class base { //do sth } class aClass extends base{ public static function create(){ return new aClass(); } } class bClass extends base{ public static function create(){ return new bClass(); } } var_dump(aClass::create()); var_dump(bClass::create());
出力:
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
上記の aClass と bClass は抽象クラス ベースから継承していますが、静的メソッド create() は両方のサブクラスに同時に実装されています。時間。 oop のアイデアに従って、この繰り返しコードは親クラス ベースに実装する必要があります。
改良されたコード
abstract class base { public static function create(){ return new self(); } } class aClass extends base{ } class bClass extends base{ } var_dump(aClass::create()); var_dump(bClass::create());
現在のコードは、以前のアイデアと一致しているようです。 create() メソッドは親クラスで共有されています。実行して何が起こるか見てみましょう。
抽象クラス ベースをインスタンス化できません...
残念ながら、親クラスの self() は親クラス ベースに解析され、子から継承されないようです。親切。この問題を解決するために、php5.3 では遅延静的バインディングの概念が導入されました。
遅延静的バインディング
abstract class base { public static function create(){ return new static(); } } class aClass extends base{ } class bClass extends base{ } var_dump(aClass::create()); var_dump(bClass::create());
このコードは前のコードとほぼ同じですが、違いは、self が親クラスではなくサブクラスに解決されることです。私が遭遇した問題は、PHP の遅延静的バインディングです。
最後に、コードを実行して、最終的に望ましい結果を取得します。
りー
上記では、内容の側面も含めて、PHP の遅延静的バインディングについての簡単な話を紹介しました。これが、PHP チュートリアルに興味のある友人に役立つことを願っています。