亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP關于靜態綁定的一點疑問

PHP關于靜態綁定的一點疑問

PHP
呼如林 2019-03-15 09:16:11
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(); 輸出結果為ACC.我的疑問是為什么第二個是C而不是B?還請各位大神賜教
查看完整描述

3 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

自己來回答一下。靜態調用分為轉發調用和非轉發調用。
轉發調用:進行靜態調用時使用static::,self::,parent::,forword_static_call進行調用。換句話說就是沒有指定類名的靜態條用。
非轉發調用:進行靜態調用時使用類名::或者進行非靜態調用時使用類名->方法名調用。換句話說就是明確地指定類名的靜態調用和非靜態調用。

再說的通俗一點,顧名思義,非轉發調用前面有類名所以調用的函數一定是屬于“這個類的”,不需要轉到別的類。轉發調用就是由于前期的靜態綁定導致在后面調用靜態方法時可能“轉發到其他的類”。

在PHP的官方文檔里,對于后期靜態綁定是這樣說的:后期靜態綁定工作原理是存儲了在上一個“非轉發調用”(non-forwarding call)中的類名。意思是當我們調用一個轉發調用的靜態調用時,實際調用的類是上一個非轉發調用的類。
現在我一步步分析上面的例子
1.C::test().毫無疑問,這是一個非轉發調用,因為::前面有類名C。
2.進入test()方法,有三個靜態調用A::foo(),parent::foo(),self::foo(),對于這三個靜態調用來說,他們的非轉發調用類就是C。
3.現在執行A::foo(),這是一個非轉發調用。A::foo()中的代碼是static::who,這是一個轉發調用,對于這個轉發調用來說他的非轉發調用類就是不再是C而是A(因為之前執行了A::foo())。因此執行的結果為A
4.現在執行parent::foo(),這是一個轉發調用,轉發到哪里呢?就是它的上一個非轉發調用的類,也就是類C(在步驟2中提到的)。在這里一定要注意雖然在這之前執行了A::foo(),但是parent::foo()的上一個非轉發調用的類任然是類C。因此執行的結果是C.
5.現在執行self::foo(),這個和parent::foo()一樣都是轉發調用,因此也輸出C。

查看完整回答
反對 回復 2019-03-18
?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

如果靜態調用使用parent::或者 self::將轉發調用信息,也就是運行時的調用者C

查看完整回答
反對 回復 2019-03-18
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

這就是靜態調用static的意義啊.
你用parent或者self會顯示 當前調用者 , 也就是C .
所以,才出現了static

查看完整回答
反對 回復 2019-03-18
  • 3 回答
  • 0 關注
  • 408 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號