自 php 5.3.0 起,php 增加了乙個叫做後期靜態繫結的功能,用於在繼承範圍內引使用 self:: 或者class對當前類的靜態引用,取決於定義當前方法所在的類:用靜態呼叫的類。
準確說,後期靜態繫結工作原理是儲存了在上乙個「非**呼叫」(non-forwarding
call)的類名。當進行靜態方法呼叫時,該類名即為明確指定的那個(通常在 ::
運算子左側部分);當進行非靜態方法呼叫時,即為該物件所屬的類。所謂的「**呼叫」(forwarding
call)指的是通過以下幾種方式進行的靜態呼叫:self::,parent::,static:: 以及
forward_static_call()。可用 get_called_class() 函式來得到被呼叫的方法所在的類名,static::
則指出了其範圍。
該功能從語言內部角度考慮被命名為「後期靜態繫結」。「後期繫結」的意思是說,static::
不再被解析為定義當前方法所在的類,而是在實際執行時計算的。也可以稱之為「靜態繫結」,因為它可以用於(但不限於)靜態方法的呼叫。
example #1 self:: 用法
<?php
class
a public
static
function
test
() }
class
bextendsa }
b::test(); //輸出a
?>
後期靜態繫結本想通過引入乙個新的關鍵字表示執行時最初呼叫的類來繞過限制。簡單地說,這個關鍵字能夠讓你在上述例子中呼叫 test() 時引用的類是 b 而不是 a。最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。
<?php
class
a public
static
function
test
() }
class
bextendsa }
b::test(); //輸出b
?>
note:在非靜態環境下,所呼叫的類即為該物件例項所屬的類。由於 $this-> 會在同一作用範圍內嘗試呼叫私有方法,而 static::
則可能給出不同結果。另乙個區別是 static:: 只能用於靜態屬性。
<?php
class
a public
function
test
() }
class
bextends
a class
cextendsa }
$b = new b();
$b->test();
$c = new c();
$c->test(); //fails
?>
以上例程會輸出:後期靜態繫結的解析會一直到取得乙個完全解析了的靜態呼叫為止。另一方面,如果靜態呼叫使用 parent:: 或者 self:: 將**呼叫資訊。success! success! success!
fatal error: call to private method c::foo() from context 『a』 in /tmp/test.php on line 9
note:
<?php
class
a public
static
function
who()
}class
bextends
a public
static
function
who()
}class
cextendsb }
c::test();
?>
以上例程會輸出:a c c
php後期靜態繫結
後期靜態繫結 static 不再被解析為定義當前方法或屬性所在的類,而是在實際執行時計算的 可用 get called class 函式來得到被呼叫的方法所在的類名 this是指向當前物件 self 指向當前的類 self就是寫在哪個類裡面,實際呼叫的就是這個類 parent 指向父類 static...
PHP高階特性 後期靜態繫結
後期繫結 的意思是說,static 不再被解析為定義當前方法所在的類,而是由最終運算時動態決定。也可以稱之為 靜態繫結 因為它可以用於 但不限於 靜態方法的呼叫。class a publicstaticfunction test class b extends a b test 輸出 class a...
PHP後期靜態繫結理解
最近遇到乙個php手冊上的例子,自己掃了一眼,做錯了,mark一下 class a public static function who class b extends a public static function who class c extends b c test 對 呼叫和非 呼叫不理...