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程序性能的技巧里均提到了这一点。有利必有弊,目前还没见到逗号连接的弊端详解。上面属于自己看到一些资料之后的总结和实验记录。有不妥之处还望赐教。


参考文献
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值