var dump 1 9 輸出什麼

2022-07-08 09:42:12 字數 1143 閱讀 9183

乙個問題, var_dump(1...9)輸出什麼?

動手驗證下:

php -r 「var_dump(1...9)」;

string(4) 」10.9「

輸出10.9, 乍一看這個var_dump的輸出很奇怪是不是? 為什麼呢?

這裡教大家,如果看到一段php**感覺輸出很奇怪,第一反應是看下這段**生成的opcodes是啥,雖然這個問題其實是詞法分析階段的問題,不過還是用phpdbg分析下吧(一般為了防止opcache的影響,會傳遞-n):

phpdbg -n -p /tmp/1.php

function name: (null)

l1-35 () /tmp/1.php - 0x7f56d1a63460 + 4 ops

l2 #0 init_fcall<1> 96 "var_dump"

l2 #1 send_val "10.9" 1

l2 #2 do_icall

l35 #3 return 1

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

dnum (?".")|("."?)

這個是詞法分析定義的浮點數的格式,到這裡也就恍然大悟了:

1...9 會被依次接受為: 1. (浮點數1), 然後是 . (字串連線符號) 然後是.9(浮點數0.9)

所以在編譯階段就會直接生成 「1」 . 「0.9」 -> 字串的字面量」10.9」

好了,到這裡,這個小「謎題」就解釋清楚了。

當然這個也不僅僅是php會這麼定義了,幾乎所有的語言都會定義這種縮寫浮點數都形式. c語言中有的時候我們為了輸入乙個浮點型的整形,就可以採用比如 1. 來告訴編譯器這是個浮點數.

只不過,一來剛好在php中.號還有另外一層含義就是字串連線,二來...在php5.6之後是個新的操作符叫做splat operator, 可以用來定義可變引數函式,或者解陣列,比如,

<?php

function foo($a, $b, $c)

$parameters = array (1, 2, 3);

foo(...$parameters);

?>

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

PHP開發中,讓var dump除錯函式輸出更美觀

最近開發發現自己電腦var dump時候沒有如下效果。並且輸出的資料程式設計一坨坨的,很難直觀的判斷。解決辦法 新增xdebug方法如下 找到php.ini檔案。在末尾新增如下 xdebug extension zend extension d wamp bin php php5.3.27 zend...

它輸出什麼?

看乙個小問題,問 echo count abc 輸出什麼?剛開始反映的是 結果輸入 一試才知道,原來輸出是 看看手冊的解釋吧 count 計算陣列中的單元數目或物件中的屬性個數 這個咱們都知道地.它的基本格式 int count mixed var int mode 返回 var 中的單元數目,通常...

19 輸出三角形

輸入乙個整數 n 0n 026 表示字母三角形的層數。按照題目描述,輸出字母三角形。樣例輸入12 樣例輸出1a bbb 樣例輸入23 樣例輸出2a bbbccccc 注意點 string類第乙個引數為字元個數,第二個引數為字元 include include using namespace std ...