まず次のコードを確認してください:
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());
抽象クラス ベースをインスタンス化できません...残念ながら、親クラスの 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());
最後に、コードを実行して、最終的に望ましい結果を取得します。
object(aClass)#1 (0) { } object(bClass)#1 (0) { }
[参考] PHP のオブジェクト指向、パターン、実践を詳しく解説します