echo後的逗號與點號
在PHP中,說到echo後的的逗號與點號,雖然兩者在如下情況中,結果相同。
echo'abc'.'def'; //使用點號連線符,結果:abcdef
echo '<br/>';
echo'abc','def';//使用逗號連線符,結果:abcdef
但總說逗號連線字串,比點號連線字串快,建議使用echo的多重引數(即採用逗號連線字串)。很讓人好奇兩者的區別。
從各方資料來看,兩者的主要區別在於點號 . 是字串連線符,逗號 , 是引數間隔符。用逗號是形成mutiple parameters(多引數),始終先計算各引數部分然後再進行連線;而點號與各種符號在一起時,會存在優先順序問題,導致可能先連線後計算的問題。
1.符號優先順序不同
假設我們想要輸出:1+5=6,下面分別在echo中用逗號和點號進行實驗。
echo '1+5='. 1+5; //結果:6
echo '<br/>';
echo '1+5='. 5+1; //結果:2
echo '<br/>';
echo '1+5='. 8+1; //輸出:2
echo '<br/><br/>';
echo '1+5=',1+5; //結果:1+5=6
echo '<br/>';
echo '1+5=',5+1; //結果:1+5=6
echo '<br/>';
echo '1+5=',8+1; //輸出:1+5=9
echo '<br/>';
顯然,用逗號得出了正確的結果,用點號不僅交換律失效,並且‘1+5=’也沒有原樣輸出。
這其中有兩個原因:
- “.”優先於“+”, 先連線再進行加法運算——而“+”優先於“,”, 先加法計算再進行連線;
當進行“+”加法運算時,PHP語法中會將兩側都轉換為數字進行計算。在字串轉換為數字時,PHP會去搜索這個字串的開頭,如果開頭是數字就轉換該數字,如果不是就直接返回0(稍後會進行演示);
運算子優先順序
參見PHP手冊可見下圖:
從上到下,優先順序從高到低;同級運算子主要看“結合方向
可見,- “,”優先順序最低,所以在上面的例子中,先算出逗號兩邊的,在進行連線;
- “+”“.”是同級運算子,並且結合方向為左,所以在例子中,“.”點號連線符先出現了,所以先進行了連線再進行加法運算。
echo '1+5='. 1+5; //結果:6
echo '<br/>';
echo '1+5='. 5+1; //結果:2
echo '<br/>';
echo '1+5='. 8+1; //輸出:2
echo '<br/><br/>';
先進行連線再進行加法運算為什麼會出現該結果,就要了解PHP將字串轉換為數字的機制了。
PHP將字串強制轉換為數字
echo (int)'dan1'; //輸出0
echo '<br/>';
echo (int)'z1dan'; //輸出0
echo '<br/>';
echo (int)'1dan'; //輸出1
echo '<br/>';
echo (int)'2dan'; //輸出2
echo '<br/>';
echo (int)'22dan'; //輸出22
echo '<br/>';
echo (int)'2d2an'; //輸出2
echo '<br/>';
echo (int)'2d2an2'; //輸出2
echo '<br/>';
從以上結果可看出,在PHP中,將字串強制轉換為數字時,會去搜索這個字串的開頭。如果開頭是數字就轉換開頭的數字。如果開頭不是數字就直接返回0。
同理,
echo 'dan1'. 1+5; //輸出5(0+5)
echo '<br/>';
echo 'z1dan'. 1+5; //輸出5(0+5)
echo '<br/>';
echo '1dan'. 1+5; //輸出6 (1+5)
echo '<br/>';
echo '2dan'. 1+5; //輸出7(2+5)
echo '<br/>';
佐證小實驗
其實除了優先順序,有很多方面可以說明運用點號連線符 . 是先進行了連線再進行加法運算:
Dandelion自己是用Dreamweaver CS6進行簡單的PHP實驗的,如果
echo '2dan'. 1+5;
echo '2dan'.1+5; //DW CS6會出現錯誤提示
如果 . 和數字之間沒有空開一格,是會出現錯誤提示的,而一般用點號連線是不需要空格的;
另,如果加上括號(括號具有很高的優先順序),
echo '1+5='.(1+5);//結果:1+5=6
echo '<br/>';
echo ('1+5'. 5)+1; //結果:2
echo '<br/>';
括號改變了執行順序,可以不用空格也可以輸出想要的結果;根據我們的猜想為執行順序加上括號,也會輸出原來的結果;說明的確是在運算子的優先順序上產生了差異。
2.逗號連線字串比點號快
不知道大家是如何檢驗逗號連線字串比點號快的,我採用的是看谷歌瀏覽器裡面的執行時間,對下面四個例子進行檢測:
$user = 'Dandelion_Miss';
echo "Hello $user welcome on my website";//最慢,採用雙引號解析
$user = 'Dandelion_Miss';
echo "Hello ".$user." welcome on my website.";//居中,與3差不多,點號連線,雙引號字串
$user = 'Dandelion_Miss';
echo 'Hello '.$user.' welcome on my website.'//居中,與2差不多,點號連線,單引號字串
$user = 'Dandelion_Miss';
echo 'Hello ', $user , ' welcome on my website.';//最快,逗號連線,單引號字串
多次測資料發現,第1是最慢的,第4是最快的。(不知道採用谷歌瀏覽器檢測的方法會不會不太好,因為時間過段時間測會不一樣,但相近時間幾者是相同的快慢關係,有更好的方法望指教)
因為單引號對字串是直接輸出,雙引號會解釋替換後輸出,所以相對較慢;逗號連線字串比點號快;
所以建議:
- 用單引號代替雙引號來包含字串;
- 使用echo的多重引數(指用逗號而不是句點)代替字串連線;
D聊一聊
今天是2016年1月6日,查了一些資料,沒找到很多關於逗號比點號快的原因解釋,當然在很多提高PHP程式效能的技巧裡均提到了這一點。有利必有弊,目前還沒見到逗號連線的弊端詳解。上面屬於自己看到一些資料之後的總結和實驗記錄。有不妥之處還望賜教。