dump(1...9)輸出什麼?舊方法新知識


「PHP編程」var_dump(1...9)輸出什麼?舊方法新知識

今天從鳥叔的博客看到了一篇文章,文章提出了一個問題:var_dump(1...9)輸出什麼?相信很多人和我一樣,在看到這篇文章之前,可能都沒有對這個問題作過深入的思考。

var_dump(1...9)輸出什麼?我們先執行一下看看!

「PHP編程」var_dump(1...9)輸出什麼?舊方法新知識

從上圖看,我們知道實際結果是10.9!是不是超出了大家的想象?

這裡教大家一個查找問題的方法,如果你看到一段PHP代碼輸出很奇怪,第一反應是看下這段代碼生成的opcodes是啥。雖然,這個問題其實是詞法分析階段的問題,不過你還是用phpdbg分析下吧,如下:

「PHP編程」var_dump(1...9)輸出什麼?舊方法新知識

一般為了防止opcache的影響,會傳遞-n

從圖中我們可以看到,早在生成opcode之前,1...9就變成了常量10.9。考慮到這是字面量,我們現在去看看zend_language_scanner.l,找到這麼一行:

DNUM ({LNUM}?"."{LNUM})|({LNUM}"."{LNUM}?)

這個是PHP定義的詞法分析定義的浮點數格式,在上面的var_dump(1...9)中,1...9實際會被依次接受為:(1.) 浮點數1,(.) 字符串連接符號, (.9)浮點數0.9。

其實這種浮點數格式,並不是PHP獨有的,實際上幾乎所有的編程語言都會定義。但是我們之所以容易迷惑,可能有兩方面的原因,一是剛好在PHP中(.)號還有另外一層含義就是字符串連接,二是(...)在PHP5.6之後有個新的操作符叫做Splat operator,可以用來定義可變參數函數,或者解數組,比如:

「PHP編程」var_dump(1...9)輸出什麼?舊方法新知識

所以, 乍一看才會導致了這個看起來很困惑的結果。

好了,到這裡,這個小“謎題”就解釋清楚了。大家懂了嗎?


分享到:


相關文章: