$user = 'Dandelion_Miss';echo "Hello $user welcome on my website";//最慢,采用雙引號(hào)解析123123 $user = 'Dandelion_Miss';echo "Hello ".$user." welcome on my website.";//居中,與3差不多,點(diǎn)號(hào)連接,雙引號(hào)字符串1212 $user = 'Dandelion_Miss';echo 'Hello '.$user.' welcome on my website.'//居中,與2差不多,點(diǎn)號(hào)連接,單引號(hào)字符串1212 $user = 'Dandelion_Miss';echo 'Hello ', $user , ' welcome on my website.';//最快,逗號(hào)連接,單引號(hào)字符串1212
2017-02-19
正想問這個(gè)問題呢,學(xué)習(xí)了。
2017-01-06
在PHP中,說到echo后的的逗號(hào)與點(diǎn)號(hào),雖然兩者在如下情況中,結(jié)果相同。
? ?echo'abc'.'def'; //使用點(diǎn)號(hào)連接符,結(jié)果:abcdef
? ?echo '<br/>'; ? ?echo'abc','def';//使用逗號(hào)連接符,結(jié)果:abcdef123123
但總說逗號(hào)連接字符串,比點(diǎn)號(hào)連接字符串快,建議使用echo的多重參數(shù)(即采用逗號(hào)連接字符串)。很讓人好奇兩者的區(qū)別。
從各方資料來看,兩者的主要區(qū)別在于點(diǎn)號(hào) . 是字符串連接符,逗號(hào) , 是參數(shù)間隔符。用逗號(hào)是形成mutiple parameters(多參數(shù)),始終先計(jì)算各參數(shù)部分然后再進(jìn)行連接;而點(diǎn)號(hào)與各種符號(hào)在一起時(shí),會(huì)存在優(yōu)先級(jí)問題,導(dǎo)致可能先連接后計(jì)算的問題。
1.符號(hào)優(yōu)先級(jí)不同
假設(shè)我們想要輸出:1+5=6,下面分別在echo中用逗號(hào)和點(diǎn)號(hào)進(jìn)行實(shí)驗(yàn)。
? ?echo '1+5='. 1+5; //結(jié)果:6
? ?echo '<br/>'; ? ?echo '1+5='. 5+1; //結(jié)果:2
? ?echo '<br/>'; ? ?echo '1+5='. 8+1; //輸出:2
? ?echo '<br/><br/>'; ? ?echo '1+5=',1+5; //結(jié)果:1+5=6
? ?echo '<br/>'; ? ?echo '1+5=',5+1; //結(jié)果:1+5=6
? ?echo '<br/>'; ? ?echo '1+5=',8+1; //輸出:1+5=9
? ?echo '<br/>';12345678910111213141234567891011121314
顯然,用逗號(hào)得出了正確的結(jié)果,用點(diǎn)號(hào)不僅交換律失效,并且‘1+5=’也沒有原樣輸出。
這其中有兩個(gè)原因:
“.”優(yōu)先于“+”, 先連接再進(jìn)行加法運(yùn)算——而“+”優(yōu)先于“,”, 先加法計(jì)算再進(jìn)行連接;
當(dāng)進(jìn)行“+”加法運(yùn)算時(shí),PHP語(yǔ)法中會(huì)將兩側(cè)都轉(zhuǎn)換為數(shù)字進(jìn)行計(jì)算。在字符串轉(zhuǎn)換為數(shù)字時(shí),PHP會(huì)去搜索這個(gè)字符串的開頭,如果開頭是數(shù)字就轉(zhuǎn)換該數(shù)字,如果不是就直接返回0(稍后會(huì)進(jìn)行演示);
運(yùn)算符優(yōu)先級(jí)
參見PHP手冊(cè)可見下圖:
從上到下,優(yōu)先級(jí)從高到低;同級(jí)運(yùn)算符主要看“結(jié)合方向”,“左”表示同級(jí)運(yùn)算符出現(xiàn)時(shí),從左到右哪個(gè)先出現(xiàn)先算哪個(gè)(”右”則從右到左哪個(gè)先出現(xiàn)先算哪個(gè))。
可見,
“,”優(yōu)先級(jí)最低,所以在上面的例子中,先算出逗號(hào)兩邊的,在進(jìn)行連接;
“+”“.”是同級(jí)運(yùn)算符,并且結(jié)合方向?yàn)樽螅栽诶又?,?”點(diǎn)號(hào)連接符先出現(xiàn)了,所以先進(jìn)行了連接再進(jìn)行加法運(yùn)算。
? ?echo '1+5='. 1+5; //結(jié)果:6
? ?echo '<br/>'; ? ?echo '1+5='. 5+1; //結(jié)果:2
? ?echo '<br/>'; ? ?echo '1+5='. 8+1; //輸出:2
? ?echo '<br/><br/>';12345671234567
先進(jìn)行連接再進(jìn)行加法運(yùn)算為什么會(huì)出現(xiàn)該結(jié)果,就要了解PHP將字符串轉(zhuǎn)換為數(shù)字的機(jī)制了。
PHP將字符串強(qiáng)制轉(zhuǎn)換為數(shù)字
? ?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
從以上結(jié)果可看出,在PHP中,將字符串強(qiáng)制轉(zhuǎn)換為數(shù)字時(shí),會(huì)去搜索這個(gè)字符串的開頭。如果開頭是數(shù)字就轉(zhuǎn)換開頭的數(shù)字。如果開頭不是數(shù)字就直接返回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
佐證小實(shí)驗(yàn)
其實(shí)除了優(yōu)先級(jí),有很多方面可以說明運(yùn)用點(diǎn)號(hào)連接符 . 是先進(jìn)行了連接再進(jìn)行加法運(yùn)算:
Dandelion自己是用Dreamweaver CS6進(jìn)行簡(jiǎn)單的PHP實(shí)驗(yàn)的,如果
? ?echo '2dan'. 1+5;
? ?echo '2dan'.1+5; //DW CS6會(huì)出現(xiàn)錯(cuò)誤提示1212
如果 . 和數(shù)字之間沒有空開一格,是會(huì)出現(xiàn)錯(cuò)誤提示的,而一般用點(diǎn)號(hào)連接是不需要空格的;
另,如果加上括號(hào)(括號(hào)具有很高的優(yōu)先級(jí)),
? ?echo '1+5='.(1+5);//結(jié)果:1+5=6
? ?echo '<br/>'; ? ?echo ('1+5'. 5)+1; //結(jié)果:2
? ?echo '<br/>'; ? 12341234
括號(hào)改變了運(yùn)行順序,可以不用空格也可以輸出想要的結(jié)果;根據(jù)我們的猜想為運(yùn)行順序加上括號(hào),也會(huì)輸出原來的結(jié)果;說明的確是在運(yùn)算符的優(yōu)先級(jí)上產(chǎn)生了差異。
2.逗號(hào)連接字符串比點(diǎn)號(hào)快
不知道大家是如何檢驗(yàn)逗號(hào)連接字符串比點(diǎn)號(hào)快的,我采用的是看谷歌瀏覽器里面的運(yùn)行時(shí)間,對(duì)下面四個(gè)例子進(jìn)行檢測(cè):
$user = 'Dandelion_Miss';echo "Hello $user welcome on my website";//最慢,采用雙引號(hào)解析123123
$user = 'Dandelion_Miss';echo "Hello ".$user." welcome on my website.";//居中,與3差不多,點(diǎn)號(hào)連接,雙引號(hào)字符串1212
$user = 'Dandelion_Miss';echo 'Hello '.$user.' welcome on my website.'//居中,與2差不多,點(diǎn)號(hào)連接,單引號(hào)字符串1212
$user = 'Dandelion_Miss';echo 'Hello ', $user , ' welcome on my website.';//最快,逗號(hào)連接,單引號(hào)字符串1212
多次測(cè)數(shù)據(jù)發(fā)現(xiàn),第1是最慢的,第4是最快的。(不知道采用谷歌瀏覽器檢測(cè)的方法會(huì)不會(huì)不太好,因?yàn)闀r(shí)間過段時(shí)間測(cè)會(huì)不一樣,但相近時(shí)間幾者是相同的快慢關(guān)系,有更好的方法望指教)
因?yàn)閱我?hào)對(duì)字符串是直接輸出,雙引號(hào)會(huì)解釋替換后輸出,所以相對(duì)較慢;逗號(hào)連接字符串比點(diǎn)號(hào)快;
所以建議:
用單引號(hào)代替雙引號(hào)來包含字符串;
使用echo的多重參數(shù)(指用逗號(hào)而不是句點(diǎn))代替字符串連接;