为了账号安全,请及时绑定邮箱和手机立即绑定

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下载
官方微信