ホームページ > バックエンド開発 > PHPチュートリアル > php 静的遅延静的バインディング_PHP チュートリアル

php 静的遅延静的バインディング_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:35:45
オリジナル
742 人が閲覧しました

あなたが怠惰なプログラマであれば、次のコードを見るとイライラするかもしれません

抽象クラス U{

}

クラス u1 は U を拡張します{

パブリック静的関数 create(){

新しい u1() を返します;

}

}

クラス u2 は U を拡張します{

パブリック静的関数 create(){

新しい u2() を返します;

}

}

このコードが正常に動作する場合は問題ありませんが、コードを何度も繰り返すと非常に面倒になります

各サブクラスに create メソッドを追加したくないのですが、スーパークラス U に create メソッドを置くと、コードは次のようになります。

抽象クラス U{

パブリック静的関数 create(){

新しい自分を返す();

}

}

クラス u1 は U を拡張します{

関数 a(){}

}

クラス u2 は U を拡張します{

}

u1::create();

非常にエレガントできちんとした見た目になります。共通のコードを 1 か所にまとめ、クラスへの参照として self を使用します。しかし、ここで私たちは自己についての仮定を立てます。

実際、クラスにおける self の役割は、オブジェクトにおける $this の役割とまったく同じではありません。 self は呼び出しコンテキストを参照するのではなく、解析コンテキストを参照するため、上記の例を実行すると

が得られます。

致命的なエラー: D:wampwwwtestoopstatic.php の 21 行目で抽象クラス U をインスタンス化できません

したがって、self は、self を呼び出す u1 クラスではなく、create を定義する U に解決されます。

php5.3 より前には、この点に関して厳しい制限があり、php5.3 では遅延静的バインディングとキーワード static の使用が導入されました。

static は self に似ていますが、それを含むクラスではなく、呼び出されるクラスを参照します。

次の例では、u1::create は U オブジェクトをインスタンス化する代わりに u1 オブジェクトを生成します

抽象クラス U{

パブリック静的関数 create(){

return new static();

}

}

クラス u1 は U を拡張します{

}

クラス u2 は U を拡張します{

}

u1::create();

static はインスタンス化に使用できるだけでなく、self やparent と同様に、静的メソッドの呼び出し識別子としても使用でき、非静的コンテキストから呼び出すこともできます

抽象クラス U{

プライベート $グループ;

パブリック関数 __construct(){

$this->group=static::getGroup();

}

パブリック静的関数 create(){

return new static();

}

静的関数 getGroup(){

「デフォルト」を返す;

}

}

クラス u1 は U を拡張します{

}

クラス u2 は U を拡張します{

静的関数 getGroup(){

「u2」を返します;

}

}

クラス u3 は u2 を拡張します{

}

print_r(u1::create());

エコー

';


print_r(u3::create());

u1 Object ( [group:U:private] =>default )

u3 オブジェクト ( [group:U:private] => u2 )

http://www.bkjia.com/PHPjc/742266.html

tru​​ehttp://www.bkjia.com/PHPjc/742266.html技術記事あなたが怠惰なプログラマーであれば、次のコードを見るとイライラするかもしれません。 abstract class U{ } class u1 extends U{ public static function create(){ return new u1() } } class u2 e...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート