在PHP中,说到echo后的的逗号与点号,虽然两者在如下情况中,结果相同。
echo "abc"."def"; //使用点号连接符,结果:abcdef
echo "
";
echo "abc","def";//使用逗号连接符,结果:abcdef
但总说逗号连接字符串,比点号连接字符串快,建议使用echo的多重参数(即采用逗号连接字符串)。很让人好奇两者的区别。
一、符号优先级不同
①、实例
假设我们想要输出:1+5=6,下面分别在echo中用逗号和点号进行实验。
echo "1+5=". 1+5; //结果:6
echo "
";
echo "1+5=". 5+1; //结果:2
echo "
";
echo "1+5=". 8+1; //输出:2
echo "
";
echo "1+5=",1+5; //结果:1+5=6
echo "
";
echo "1+5=",5+1; //结果:1+5=6
echo "
";
echo "1+5=",8+1; //输出:1+5=9
echo "
";
显然,用逗号得出了正确的结果,用点号不仅交换律失效,并且‘1+5=’也没有原样输出。
这其中有两个原因:
“.”优先于“+”, 先连接再进行加法运算——而“+”优先于“,”, 先加法计算再进行连接;
当进行“+”加法运算时,PHP语法中会将两侧都转换为数字进行计算。在字符串转换为数字时,PHP会去搜索这个字符串的开头,如果开头是数字就转换该数字,如果不是就直接返回0(稍后会进行演示);
②、运算符优先级
从上到下,优先级从高到低;同级运算符主要看“结合方向”,“左”表示同级运算符出现时,从左到右哪个先出现先算哪个(”右”则从右到左哪个先出现先算哪个)。 可见:
“,”优先级最低,所以在上面的例子中,先算出逗号两边的,在进行连接;
“+”“.”是同级运算符,并且结合方向为左,所以在例子中,“.”点号连接符先出现了,所以先进行了连接再进行加法运算。
echo "1+5=". 1+5; //结果:6
echo "
";
echo "1+5=". 5+1; //结果:2
echo "
";
echo "1+5=". 8+1; //输出:2
echo "
";
先进行连接再进行加法运算为什么会出现该结果,就要了解PHP将字符串转换为数字的机制了。
二、PHP将字符串强制转换为数字
echo (int)"dan1"; //输出0
echo "
";
echo (int)"z1dan"; //输出0
echo "
";
echo (int)"1dan"; //输出1
echo "
";
echo (int)"2dan"; //输出2
echo "
";
echo (int)"22dan"; //输出22
echo "
";
echo (int)"2d2an"; //输出2
echo "
";
echo (int)"2d2an2"; //输出2
echo "
";
从以上结果可看出,在PHP中,将字符串强制转换为数字时,会去搜索这个字符串的开头。如果开头是数字就转换开头的数字。如果开头不是数字就直接返回0。 同理:
echo "dan1". 1+5; //输出5(0+5)
echo "
";
echo "z1dan". 1+5; //输出5(0+5)
echo "
";
echo "1dan". 1+5; //输出6 (1+5)
echo "
";
echo "2dan". 1+5; //输出7(2+5)
三、逗号连接字符串比点号快
不知道大家是如何检验逗号连接字符串比点号快的,我采用的是看谷歌浏览器里面的运行时间,对下面四个例子进行检测:
$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的多重参数(指用逗号而不是句点)代替字符串连接;