1. 程式人生 > >echo後的逗號與點號

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程式效能的技巧裡均提到了這一點。有利必有弊,目前還沒見到逗號連線的弊端詳解。上面屬於自己看到一些資料之後的總結和實驗記錄。有不妥之處還望賜教。

參考文獻