php後期静的バインド
2065 ワード
php 5から.3からphpは、継承範囲内で静的呼び出しを参照するクラスに後期バインドという機能を追加します.
この機能は言語内部の観点から「後期静的バインド」と命名されている.「後期バインド」とは、static::現在のメソッドが定義されているクラスではなく、実際の実行時に計算されたものであり、「静的バインド」にもなります.静的メソッドの呼び出しに限定されないため、彼は使用することができる.
self::の制限
selfの使用::または_class_現在のメソッドが定義されているクラスに応じて、現在のクラスの静的参照
例:
印刷結果:A
後期静的バインドの使用法
後期静的バインドは、実行時に最初に呼び出されたクラスを表すキーワードを導入することによって制限を回避しようとします.簡単に言えば、このキーワードは、上記でtest()を呼び出すときに参照するクラスがAではなくBであることを可能にします.最終的には、新しいキーワードを参照するのではなく、予約済みstaticキーワードを使用することにします.
例:
印刷結果:B
後期静的バインディングの処理方式は、従来全く解決されていなかった静的呼び出しを解決する一方、静的呼び出しがparent::またはself::を使用すると呼び出し情報が転送される
印刷結果:
A C C
例:
印刷結果:a
b
特別声明:
get_called_class();クラスの名前を取得する静的メソッドで呼び出されます
この機能は言語内部の観点から「後期静的バインド」と命名されている.「後期バインド」とは、static::現在のメソッドが定義されているクラスではなく、実際の実行時に計算されたものであり、「静的バインド」にもなります.静的メソッドの呼び出しに限定されないため、彼は使用することができる.
self::の制限
selfの使用::または_class_現在のメソッドが定義されているクラスに応じて、現在のクラスの静的参照
例:
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test(); //A
印刷結果:A
後期静的バインドの使用法
後期静的バインドは、実行時に最初に呼び出されたクラスを表すキーワードを導入することによって制限を回避しようとします.簡単に言えば、このキーワードは、上記でtest()を呼び出すときに参照するクラスがAではなくBであることを可能にします.最終的には、新しいキーワードを参照するのではなく、予約済みstaticキーワードを使用することにします.
例:
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); //
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
印刷結果:B
後期静的バインディングの処理方式は、従来全く解決されていなかった静的呼び出しを解決する一方、静的呼び出しがparent::またはself::を使用すると呼び出し情報が転送される
<?php
class A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__."
";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function who() {
echo __CLASS__."
";
}
}
class C extends B {
public static function who() {
echo __CLASS__."
";
}
}
C::test();
?>
印刷結果:
A C C
例:
<?php
class a {
static public function test() {
print get_called_class();
}
}
class b extends a {
}
a::test();
b::test();
?>
印刷結果:a
b
特別声明:
get_called_class();クラスの名前を取得する静的メソッドで呼び出されます