PHP的单引号和双引号 字符串效率


Posted in PHP onMay 27, 2009

简单的回答,显然是苍白无力的。 今天我们来做个实验,看看到底单引号和双引号有什么区别,谁快,谁慢。
测试代码如下:

<?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中的属性值应该是使用双引号来包含的 ,所以不要习惯了单引号,到处滥用哦

PHP 相关文章推荐
PHP sprintf() 函数的应用(定义和用法)
Jun 29 PHP
处理单名多值表单的详解
Jun 08 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
Mar 18 PHP
php实现encode64编码类实例
Mar 24 PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
Zend Framework框架中实现Ajax的方法示例
Jun 27 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
Yii框架Session与Cookie使用方法示例
Oct 14 PHP
laravel 解决Validator使用中出现的问题
Oct 25 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
PHP数组基本用法与知识点总结
Jun 02 PHP
php session 错误
May 21 #PHP
php print EOF实现方法
May 21 #PHP
php 方便水印和缩略图的图形类
May 21 #PHP
简单的php 验证图片生成函数
May 21 #PHP
PHP 数组入门教程小结
May 20 #PHP
php 无限级 SelectTree 类
May 19 #PHP
PHP日期时间函数的高级应用技巧
May 16 #PHP
You might like
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
javascript新手语法小结
2008/06/15 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
Python3实现并发检验代理池地址的方法
2016/09/18 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python 变量类型详解
2018/10/10 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
获奖的大学生创业计划书
2014/01/05 职场文书
校本教研工作制度
2014/01/22 职场文书
入股协议书
2014/04/14 职场文书
安全教育演讲稿
2014/05/09 职场文书
客房服务员岗位职责
2015/02/09 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
自主招生自荐信格式
2015/03/04 职场文书
倡议书的格式写法
2015/04/28 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
通过Python把学姐照片做成拼图游戏
2022/02/15 Python