msgbartop
PHP源码分析,Zend引擎分析,Web相关技术研究,Web技术分享–左手代码 右手诗
msgbarbottom

19 Aug 08 PHP的单引号和双引号

经常有人问我,听说在PHP中处理字符串用单引号会快,那么如果存在变量替换的时候,是使用单引号连接快呢,还是双引号快呢? 简单的回答,显然是苍白无力的。 今天我们来做个实验,看看到底单引号和双引号有什么区别,谁快,谁慢。

测试代码如下:

<?php
$single_quotes = 'This is a String';
$double_quotes = "This is a String";
echo $single_quotes;
echo $double_quotes;

$var = 'String';
$single_quotes_var = 'This is a '.$var;
$double_quotes_var = "This is a $var";

echo $single_quotes_var;
echo $double_quotes_var;

$var = 'This';

$single_quotes_var_pre = $var . ' is a String';
$double_quotes_var_pre = "$var is a String";

echo $single_quotes_var_pre;
echo $double_quotes_var_pre;
?>

接下来,让我们以前文章提到过的Opcodes生成器来看看,最终我们的这段代码是怎么被执行的:

Branch analysis from position: 0
Return found
filename:       /home/xinchen/string.php
function name:  (null)
number of ops:  24
compiled vars:  !0 = $single_quotes, !1 = $double_quotes, !2 = $var, !3 = $single_quotes_var, !4 = $double_quotes_var, !5 = $single_quotes_var_pre, !6 = $double_quotes_var_pre
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   2     0  ASSIGN                                                   !0, 'This+is+a+String'
   3     1  ASSIGN                                                   !1, 'This+is+a+String'
   4     2  ECHO                                                     !0
   5     3  ECHO                                                     !1
   7     4  ASSIGN                                                   !2, 'String'
   8     5  CONCAT                                           ~3      'This+is+a+', !2
         6  ASSIGN                                                   !3, ~3
   9     7  INIT_STRING                                      ~5
         8  ADD_STRING                                       ~5      ~5, 'This+is+a+'
         9  ADD_VAR                                          ~5      ~5, !2
        10  ASSIGN                                                   !4, ~5
  11    11  ECHO                                                     !3
  12    12  ECHO                                                     !4
  14    13  ASSIGN                                                   !2, 'This'
  16    14  CONCAT                                           ~8      !2, '+is+a+String'
        15  ASSIGN                                                   !5, ~8
  17    16  INIT_STRING                                      ~10
        17  ADD_VAR                                          ~10     ~10, !2
        18  ADD_STRING                                       ~10     ~10, '+is+a+String'
        19  ASSIGN                                                   !6, ~10
  19    20  ECHO                                                     !5
  20    21  ECHO                                                     !6
  22    22  RETURN                                                   1
        23* ZEND_HANDLE_EXCEPTION

注意第0到第3条op line, 可以看出在没有使用变量替换的情况下,双引号的和单引号所产生的Opcodes是一样的。
再来看:第4到第12条, 可以发现,在使用变量替换的情况下,使用双引号和单引号所生成的Opcodes是不一样的,我们来分析双引号情况下的Opcodes:
7 INIT_STRING 初始化一个字符串变量,存放在~5临时变量中。
8 ADD_STRING 将第一部分字符串写入。
9 ADD_VAR 将变量替换的字符串写入。
第16-28行同理。

从这里我们可以发现,在使用双引号的情况下和使用单引号的情况下,同样的逻辑,所经历的执行确实不一样的(因为,Opcodes对于PHP来说就是最终的执行代码)。单单从生成的Opcods数量来说,就已经足以证明确实是使用单引号会快了。

至于编译阶段,双引号和单引号的区别也是很大的, 我就举个数字来说明: 在scanning阶段, 对于双引号的词法规则有14条,而对于单引号,仅仅只有6条。

呵呵,是不是经过这样的分析,你会更清楚的了解到以后该怎么使用单引号和双引号了呢?
顺便说一句,对于不需要变量替换的纯字符串,大家都知道,因为在C/C++中,双引号才表示字符串,所以这种情况下,还是使用双引号的好。
另外对于W3C标准来说, HTML中的属性值应该是使用双引号来包含的 ,所以不要习惯了单引号,到处滥用哦 ;)

Related Posts:

Tags:

Reader's Comments

  1. |

    我习惯,我滥用

  2. |

    ^_^,好吧。。

  3. |

    要滥用才好

  4. |

    恩,其实,用哪个完全是个个人喜好问题, 有人会说,对效率有影响,那是有点太极端了

    我这篇文章,只是分析一下孰快孰慢而已,;)

  5. |

    W3C里对引号好像没有特殊要求把?好像用validator=strict也没测出来过不符合标准

  6. |

    [...] 至于两者的速度,从逻辑上推理,单引号的功能少、规则简单,应该比双引号的速度快。风雪之隅也曾撰文《PHP的单引号和双引号》,从Opcodes的层面,得出了“单引号比双引号快”这个结论。但我之前针对纯字符串(无转义、无变量引用)做过测试,得出的结论竟然是“双引号比单引号快”。大家也可以写一下代码测试一下单双引号在不同情况下的速度。 [...]

Leave a Comment

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word