ホームページ  >  記事  >  バックエンド開発  >  PHP 学習メモ -- 遅延静的バインディング

PHP 学習メモ -- 遅延静的バインディング

WBOY
WBOYオリジナル
2016-06-23 13:18:04688ブラウズ

使用シナリオ

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

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 の遅延静的バインディングによって解決できます。

最後に、コードを実行して、最終的に望ましい結果を取得します。

object(aClass)#1 (0) { } object(bClass)#1 (0) { }

[参考] PHP のオブジェクト指向、パターン、実践を詳しく解説します

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