PHP新特性 第9.7章 字符串-echo后的逗号与点号 PHP新特性 第9.7章 字符串-echo后的逗号与点号

2023-06-16

在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的多重参数(指用逗号而不是句点)代替字符串连接;

阅读 466