浅谈php的单引号与双引号

前言

一说起单引号与双引号,大家就会联想到,单引号比双引号速度快,双引号会解析内部的变量,而单引号不会等等的区别。那如果使用单双信号连接变量时,哪个更快呢?来看如下测试:

测试代码如图1:

图1

接下来让我们看这段代码是怎么被执行的:

执行命令来查看OPCode来分析:php -d vld.active=1 -d vld.execute=0 test.php

图2

图2的相关参数就不做过多讲解,详情可以参考我之前写的一篇文章php原理:vld-查看OPCode神器查看。

(1)来看OPCode(#*列为序号)的第0-3条, 可以看出在没有使用变量替换的情况下,双引号的和单引号所产生的Opcodes是一样的。

这就说明了纯字符串的时候,单双引号执行速度是一样的吗?其实不然,虽然其OPArray里的操作数一致,但执行并非只有这一步,还有词法分析(可以了解下token_get_all函数)、语法分析、编译环节。至于编译阶段,双引号和单引号的区别也是很大的, 我就举个数字来说明: 在scanning阶段, 对于双引号的词法规则有14条,而对于单引号,仅仅只有6条

(2)单引号拼接:从序号5(对应代码第9行)来看,CONCAT将字符串'This+is+a+'与变量!2(对应程序变量$var)连接,然后赋值到临时变量~10中,序号6来看,ASSIGN是将临时变量~10分配到了!3(对应程序变量$single_quotes_var)上。

(3)双引号:从序号7(对应代码第10行)来看,首先会有一个NOP空操作指令,FAST_CONCAT(与CONCAT相比,应该见名识意,更加快速的连接吧将字符串'This+is+a+'与变量!2(对应程序变量$var)连接,然后赋值到临时变量~12中,序号9来看,ASSIGN是将临时变量~12分配到了!4(对应程序变量$double_quotes_var)上。

上述来看,双引号多了一个NOP的空操作指令。以下行同理。

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

经过上述的分析,是不是知道以后该怎么使用单引号和双引号了呢?

扩展:

顺便说一句,对于不需要变量替换的纯字符串,大家都知道,因为在C/C++中,双引号才表示字符串,所以这种情况下,还是使用双引号的好。

另外对于W3C标准来说, HTML中的属性值应该是使用双引号来包含的 ,所以不要习惯了单引号,到处滥用。

此文参考鸟哥的PHP的单引号和双引号这篇文章,内容有调整+自己的理解,只为能够更为白话的展现出来。


有什么问题请留言,大家一起探讨学习。

你可能感兴趣的:(浅谈php的单引号与双引号)