ホームページ  >  記事  >  バックエンド開発  >  PHPの遅延静的バインディングについて簡単に説明します

PHPの遅延静的バインディングについて簡単に説明します

高洛峰
高洛峰オリジナル
2016-12-26 16:09:49967ブラウズ

使用シナリオ

まず次のコードを確認してください:

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 サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。