使用シナリオ
まず次のコードを確認してください:
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() は 2 つのサブクラスに同時に実装されています。 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 の遅延静的バインディングです。
最後に、コードを実行して、最終的に望ましい結果を取得します。
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
PHP の遅延静的バインディングについての単純な説明に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。