浅谈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的单引号和双引号这篇文章,内容有调整+自己的理解,只为能够更为白话的展现出来。


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,926评论 0 10
  • PHP虽然是世界上最好的语言,但是它本身作为一门脚本语言,其运行效率一直被人们所诟病。 作为以PHP为开发语言的应...
    guanguans阅读 641评论 1 9
  • 1 字符串 1.1 少用正则表达式 能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式, 因为其效...
    丶Assassin丨阅读 715评论 1 9
  • 嗯,想不通,想不通,迷茫,迷茫 特么的,烦死了,
    如果時光不哭泣阅读 108评论 1 1
  • 后山 陵直立在那朵花之前,一动不动。 这时,一阵谷风吹来,“喵!”原来是黑暗中树上有只猫被吹落撞到陵了。 被撞倒在...
    searth阅读 285评论 0 0