乙個問題, 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 ...