[字号:  ]

单引号?双引号

发布时间:2008-8-20 20:28   作者: laruence   信息来源: PHPChina 开源社区门户
· 作者:laruence(http://www.laruence.com/)
· 本文地址: http://www.laruence.com/2008/08/19/338.html
· 转载请注明出处               

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

接下来,让我们以前文章提到过的Opcodes生成器来看看,最终我们的这段代码是怎么被执行的:注意第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条。
   呵呵,是不是经过这样的分析,你会更清楚的了解到以后该怎么使用单引号和双引号了呢?
   顺便说一句,对于W3C标准来说, HTML中的属性值应该是使用双引号来包含的 ,所以不要习惯了单引号,到处滥用哦。

[ 本帖最后由 七月十五 于 2008-11-9 10:26 编辑 ]

最新回复

wodoe at 2008-8-20 21:27:18
能具体说清楚点吗?
代码看不懂,没有看明白你说什么.Opcods什么的都不知道

没有使用变量替换的情况下,双引号的和单引号用那个?
有变量的情况下用那个?
都有的情况下用那个?
laruence at 2008-8-20 21:42:05
唉,你就翻翻我前面的文章么。
小星 at 2008-8-20 21:47:01

QUOTE:

原帖由 wodoe 于 2008-8-20 21:27 发表
能具体说清楚点吗?
代码看不懂,没有看明白你说什么.Opcods什么的都不知道

没有使用变量替换的情况下,双引号的和单引号用那个?
有变量的情况下用那个?
都有的情况下用那个?
PHP执行代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend
1.
Scanning(Lexing) ,PHP代码转换为语言片段(Tokens)
2.
Parsing, Tokens转换成简单而有意义的表达式
3.
Compilation, 将表达式编译成Opocdes
4.
Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

生成的Opocdes代码量越少,执行相对就越快
wodoe at 2008-8-20 21:49:01
晕哦  去看了下,和这里的内容完全一样啊
麻烦给说下 我上面的三个问题 就用"单"和"双",一共三个字就ok 了
wodoe at 2008-8-20 21:49:48

QUOTE:

原帖由 小星 于 2008-8-20 21:47 发表


PHP执行代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend
1.
Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
2.
Parsing, 将Tokens转换成简单而有意义的表达式
3.
Compilation, 将表达式编 ...
前面的词语都不懂
laruence at 2008-8-20 21:50:00
ls的ls,能很好的回答你的问题

简单点就是,尽量使用单引号
wodoe at 2008-8-20 21:55:01
收到,这多好 现在我什么也看不懂,怎么说都不如这一句

来一个
echo '我是一个'. $china.'中国人';
其中$china=大大地好的
laruence at 2008-8-20 21:56:18
呵呵,好吧。。。
陈虎城 at 2008-8-20 22:55:47
顶一顶
sara at 2008-8-20 23:01:14
不错的测试
leric at 2008-8-21 00:45:42
很有意思的一个话题,把我们引向了更接近根源的领域
看来现在写编译器都是定义个语法,自动生成分析器了啊

[ 本帖最后由 leric 于 2008-8-21 00:48 编辑 ]
laruence at 2008-8-21 00:52:20
lex么,呵呵
leric at 2008-8-21 10:20:21
and yacc
laruence at 2008-8-21 10:21:59
恩,严格来讲,yacc应该是语法&文法分析器