php手冊上關(guān)于后期靜態(tài)綁定如下解釋:
后期靜態(tài)綁定工作原理是存儲了在上一個(gè)"非轉(zhuǎn)發(fā)調(diào)用"的類名艘刚。
這里我們先明確什么是"轉(zhuǎn)發(fā)調(diào)用":
"轉(zhuǎn)發(fā)調(diào)用"指的是通過以下幾種方式進(jìn)行的靜態(tài)調(diào)用:self::, parent::, static::以及forward_static_call()。可以理解為沒有指定類名的靜態(tài)調(diào)用就是"轉(zhuǎn)發(fā)調(diào)用"席爽。
那么"非轉(zhuǎn)發(fā)調(diào)用"就是指明確指定類名的靜態(tài)調(diào)用和非靜態(tài)調(diào)用。
該功能從語言內(nèi)部角度考慮被命名為“后期靜態(tài)綁定”。“后期綁定”的意思是說戒傻,static:: 不再被解析為定義當(dāng)前方法所在的類,而是在實(shí)際運(yùn)行時(shí)計(jì)算的蜂筹。也可以稱之為“靜態(tài)綁定”需纳,因?yàn)樗梢杂糜冢ǖ幌抻冢╈o態(tài)方法的調(diào)用。
下面我們看看官網(wǎng)給的例子講解:
class A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function who() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function who() {
echo __CLASS__."\n";
}
}
C::test();
分析這段代碼:
C::test()艺挪,進(jìn)入類B調(diào)用了A::foo(), parent::foo(), self::foo()
根據(jù)概念C::test()就是"非轉(zhuǎn)發(fā)調(diào)用"不翩,類名C
通過A::foo()進(jìn)入類A的foo方法,即'上一次非轉(zhuǎn)發(fā)調(diào)用'的類變成A了麻裳,所以static::代表類A口蝠,A來調(diào)用who
parent::foo()進(jìn)入類A的foo方法,但"上一次非轉(zhuǎn)發(fā)調(diào)用"的類仍然為C掂器,所以static::代表C亚皂,C來調(diào)用who
self::foo()進(jìn)入類B的foo方法俱箱,"上一次非轉(zhuǎn)發(fā)調(diào)用"的類還是C国瓮,所以static::代表C,C來調(diào)用who
所以得出:
A C C