ホームページ > バックエンド開発 > PHPチュートリアル > PHPの遅延静的バインディングとは何ですか?遅延静的バインディングのサンプルコードの詳細な説明

PHPの遅延静的バインディングとは何ですか?遅延静的バインディングのサンプルコードの詳細な説明

伊谢尔伦
リリース: 2023-03-14 09:50:01
オリジナル
2187 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート