後期靜態綁定。從PHP 5.3.0開始,PHP增加了一個叫做後期靜態綁定的功能,用於在繼承範圍內引用靜態調用的類。該功能從語言內部角度考慮被命名為”後期靜態綁定“。”後期綁定“的意思是說,static::不再被解析為定義當前方法所在的類,而是在實際運行時計算的。也可以稱之為”靜態綁定“,因為它可以用於(但不限於)靜態方法的調用。
簡介,self::的限制,self::用法,後期靜態綁定的用法,static::簡單用法,Note:,轉發和非轉發調用,特殊情況,
簡介
後期靜態綁定
從PHP 5.3.0開始,PHP增加了一個叫做後期靜態綁定的功能,用於在繼承範圍內引用靜態調用的類。
該功能從語言內部角度考慮被命名為”後期靜態綁定“。”後期綁定“的意思是說,static::不再被解析為定義當前方法所在的類,而是在實際運行時計算的。也可以稱之為”靜態綁定“,因為它可以用於(但不限於)靜態方法的調用。
self::的限制
使用self:: 或者 __CLASS__對當前類的靜態引用,取決於定義當前方法所在的類:
self::用法
php
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
後期靜態綁定的用法
後期靜態綁定試圖通過引入一個關鍵字表示運行時最初調用的類來繞過限制。簡單地說,這個關鍵字能夠讓你在上述例子中調用test()時引用的類是B而不是A。最終決定不引入新的關鍵字,而是使用已經預留的static關鍵字。
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
Note:
static:: 在處理靜態方法時與 $this 是不同的。 $this-> 會遵循繼承規則,但是 static:: 不會。該差異將稍後在本手冊中詳細說明。
php
class TestChild extends TestParent {
public function __construct() {
static::who();
}
public function test() {
$o = new TestParent();
}
public static function who() {
echo __CLASS__." ";
}
}
class TestParent {
public function __construct() {
static::who();
}
public static function who() {
echo __CLASS__." ";
}
}
$o = new TestChild;
$o->test();
?>
以上例程會輸出:
TestChild
TestParent
Note:
後期靜態綁定的處理方式解決了以往完全沒有辦法解決的靜態調用。另外一方面,如果靜態調用使用 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中有很多方式來觸發一個方法的調用,例如回調函式或者魔術方法。因為後期靜態綁定取決於運行時的信息,因此在特殊情況下可能會得到意想不到的結果。
在魔術方法中使用後期靜態綁定
<?php
class A {
protected static function who() {
echo __CLASS__." ";
}
public function __get($var) {
return static::who();
}
}
class B extends A {
protected static function who() {
echo __CLASS__." ";
}
}
$b = new B;
$b->foo;
?>
以上例程會輸出:
B