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实现小型站点广告管理
Oct 09 PHP
推荐php模板技术[转]
Jan 04 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
关于php循环跳出的问题
Jul 01 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php中Array2xml类实现数组转化成XML实例
Dec 08 PHP
PHP 正则表达式小结
Feb 12 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
咖啡冲泡指南 咖啡有哪些制作方式 单品咖啡 意式咖啡
2021/03/06 冲泡冲煮
ADODB类使用
2006/11/25 PHP
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
详解python字节码
2018/02/07 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
Python3中的json模块使用详解
2018/05/05 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
捐书寄语赠言
2014/01/18 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
食品安全处置方案
2014/06/14 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang