php 遅延静的バインディング: クラスの自己を参照します。これは、定義時間に基づいているのではなく、計算中の実行結果に基づいています。
(1) サブクラスのインスタンス化されたオブジェクト $stu が Say メソッドを呼び出すと、親クラス Human 内で実行されるため、say() 内の self::hei() は親クラスの hei() メソッドを呼び出します。
(2) static::method name(): static キーワードを使用すると、まずサブクラスでメソッドが検索され、見つからない場合は親クラスで検索されます。
使用シナリオ
まず、次のコードを観察します:
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 中国語 Web サイトの他の関連記事を参照してください。