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();
輸出結(jié)果為ACC.我的疑問(wèn)是為什么第二個(gè)是C而不是B?還請(qǐng)各位大神賜教
自己來(lái)回答一下。靜態(tài)調(diào)用分為轉(zhuǎn)發(fā)調(diào)用和非轉(zhuǎn)發(fā)調(diào)用。
轉(zhuǎn)發(fā)調(diào)用:進(jìn)行靜態(tài)調(diào)用時(shí)使用static::,self::,parent::,forword_static_call進(jìn)行調(diào)用。換句話說(shuō)就是沒(méi)有指定類名的靜態(tài)條用。
非轉(zhuǎn)發(fā)調(diào)用:進(jìn)行靜態(tài)調(diào)用時(shí)使用類名::或者進(jìn)行非靜態(tài)調(diào)用時(shí)使用類名->方法名調(diào)用。換句話說(shuō)就是明確地指定類名的靜態(tài)調(diào)用和非靜態(tài)調(diào)用。
再說(shuō)的通俗一點(diǎn),顧名思義,非轉(zhuǎn)發(fā)調(diào)用前面有類名所以調(diào)用的函數(shù)一定是屬于“這個(gè)類的”,不需要轉(zhuǎn)到別的類。轉(zhuǎn)發(fā)調(diào)用就是由于前期的靜態(tài)綁定導(dǎo)致在后面調(diào)用靜態(tài)方法時(shí)可能“轉(zhuǎn)發(fā)到其他的類”。
在PHP的官方文檔里,對(duì)于后期靜態(tài)綁定是這樣說(shuō)的:后期靜態(tài)綁定工作原理是存儲(chǔ)了在上一個(gè)“非轉(zhuǎn)發(fā)調(diào)用”(non-forwarding call)中的類名。意思是當(dāng)我們調(diào)用一個(gè)轉(zhuǎn)發(fā)調(diào)用的靜態(tài)調(diào)用時(shí),實(shí)際調(diào)用的類是上一個(gè)非轉(zhuǎn)發(fā)調(diào)用的類。
現(xiàn)在我一步步分析上面的例子
1.C::test().毫無(wú)疑問(wèn),這是一個(gè)非轉(zhuǎn)發(fā)調(diào)用,因?yàn)?:前面有類名C。
2.進(jìn)入test()方法,有三個(gè)靜態(tài)調(diào)用A::foo(),parent::foo(),self::foo(),對(duì)于這三個(gè)靜態(tài)調(diào)用來(lái)說(shuō),他們的非轉(zhuǎn)發(fā)調(diào)用類就是C。
3.現(xiàn)在執(zhí)行A::foo(),這是一個(gè)非轉(zhuǎn)發(fā)調(diào)用。A::foo()中的代碼是static::who,這是一個(gè)轉(zhuǎn)發(fā)調(diào)用,對(duì)于這個(gè)轉(zhuǎn)發(fā)調(diào)用來(lái)說(shuō)他的非轉(zhuǎn)發(fā)調(diào)用類就是不再是C而是A(因?yàn)橹皥?zhí)行了A::foo())。因此執(zhí)行的結(jié)果為A
4.現(xiàn)在執(zhí)行parent::foo(),這是一個(gè)轉(zhuǎn)發(fā)調(diào)用,轉(zhuǎn)發(fā)到哪里呢?就是它的上一個(gè)非轉(zhuǎn)發(fā)調(diào)用的類,也就是類C(在步驟2中提到的)。在這里一定要注意雖然在這之前執(zhí)行了A::foo(),但是parent::foo()的上一個(gè)非轉(zhuǎn)發(fā)調(diào)用的類任然是類C。因此執(zhí)行的結(jié)果是C.
5.現(xiàn)在執(zhí)行self::foo(),這個(gè)和parent::foo()一樣都是轉(zhuǎn)發(fā)調(diào)用,因此也輸出C。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。