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 相关文章推荐
用函数读出数据表内容放入二维数组
Oct 09 PHP
PHP通过header实现文本文件下载的代码
Aug 08 PHP
用Simple Excel导出xls实现方法
Dec 06 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
PHP获取一段文本显示点阵宽度和高度的方法
Mar 12 PHP
使用Thinkphp框架开发移动端接口
Aug 05 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
Dec 14 PHP
详解WordPress中分类函数wp_list_categories的使用
Jan 04 PHP
PHP编写RESTful接口
Feb 23 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
Jul 31 PHP
PHP生成短网址的思路以及实现方法的详解
Mar 25 PHP
PHP实现简单日历类编写
Aug 28 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数组的一些常见操作汇总
2011/07/17 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
bootstrap中添加额外的图标实例代码
2017/02/15 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
深入理解Python中的元类(metaclass)
2015/02/14 Python
Python中将字典转换为列表的方法
2016/09/21 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
波兰补充商店:Muscle Power
2018/10/29 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
MySQL 数据库范式化设计理论
2022/04/22 MySQL