亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

echo time(),'<br/>'; 為什么會用逗號連接?

問一個弱弱的問題,為什么中間會是用逗號連接,而不是點.?

正在回答

2 回答

正想問這個問題呢,學習了。

0 回復 有任何疑惑可以回復我~

在PHP中,說到echo后的的逗號與點號,雖然兩者在如下情況中,結果相同。

? ?echo'abc'.'def'; //使用點號連接符,結果:abcdef
? ?echo '<br/>'; ? ?echo'abc','def';//使用逗號連接符,結果:abcdef123123

但總說逗號連接字符串,比點號連接字符串快,建議使用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/>';12345678910111213141234567891011121314

顯然,用逗號得出了正確的結果,用點號不僅交換律失效,并且‘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/>';12345671234567

先進行連接再進行加法運算為什么會出現該結果,就要了解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/>';12345678910111213141234567891011121314

從以上結果可看出,在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/>'; 1234567812345678

佐證小實驗

其實除了優先級,有很多方面可以說明運用點號連接符 . 是先進行了連接再進行加法運算:
Dandelion自己是用Dreamweaver CS6進行簡單的PHP實驗的,如果

? ?echo '2dan'. 1+5;
? ?echo '2dan'.1+5; //DW CS6會出現錯誤提示1212

如果 . 和數字之間沒有空開一格,是會出現錯誤提示的,而一般用點號連接是不需要空格的;
另,如果加上括號(括號具有很高的優先級),

? ?echo '1+5='.(1+5);//結果:1+5=6
? ?echo '<br/>'; ? ?echo ('1+5'. 5)+1; //結果:2
? ?echo '<br/>'; ? 12341234

括號改變了運行順序,可以不用空格也可以輸出想要的結果;根據我們的猜想為運行順序加上括號,也會輸出原來的結果;說明的確是在運算符的優先級上產生了差異。

2.逗號連接字符串比點號快

不知道大家是如何檢驗逗號連接字符串比點號快的,我采用的是看谷歌瀏覽器里面的運行時間,對下面四個例子進行檢測:

$user = 'Dandelion_Miss';echo "Hello $user welcome on my website";//最慢,采用雙引號解析123123
$user = 'Dandelion_Miss';echo "Hello ".$user." welcome on my website.";//居中,與3差不多,點號連接,雙引號字符串1212
$user = 'Dandelion_Miss';echo 'Hello '.$user.' welcome on my website.'//居中,與2差不多,點號連接,單引號字符串1212
$user = 'Dandelion_Miss';echo 'Hello ', $user , ' welcome on my website.';//最快,逗號連接,單引號字符串1212

多次測數據發現,第1是最慢的,第4是最快的。(不知道采用谷歌瀏覽器檢測的方法會不會不太好,因為時間過段時間測會不一樣,但相近時間幾者是相同的快慢關系,有更好的方法望指教)

因為單引號對字符串是直接輸出,雙引號會解釋替換后輸出,所以相對較慢;逗號連接字符串比點號快;

所以建議:

用單引號代替雙引號來包含字符串;

使用echo的多重參數(指用逗號而不是句點)代替字符串連接;


4 回復 有任何疑惑可以回復我~
#1

慕勒8305455

學習了,受影響了
2019-03-10 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

echo time(),'<br/>'; 為什么會用逗號連接?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號