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读MYSQL中文乱码的解决方法
Dec 17 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
ThinkPHP之foreach标签使用概述
Jun 30 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
PHP+Ajax实现验证码的实时验证
Jul 20 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
php+mysql开发中的经验与常识小结
Mar 25 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 04 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
PHP中PDO基础教程 入门级
2011/09/04 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
Django使用多数据库的方法
2017/09/06 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
Python中多线程thread与threading的实现方法
2014/08/18 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
django框架如何集成celery进行开发
2017/05/24 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
如何使用python传入不确定个数参数
2020/02/18 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
如何将字串String转换成整数int
2015/02/21 面试题
机电一体化专业应届本科生求职信
2013/09/27 职场文书
英语专业毕业生自我鉴定
2013/11/09 职场文书
小学作文评语大全
2014/04/21 职场文书
婚礼新人答谢词
2015/01/04 职场文书
班主任自我评价范文
2015/03/11 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
python图片灰度化处理的几种方法
2021/06/23 Python
VUE递归树形实现多级列表
2022/07/15 Vue.js