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 相关文章推荐
别人整理的服务器变量:$_SERVER
Oct 20 PHP
adodb与adodb_lite之比较
Dec 31 PHP
php 获取全局变量的代码
Apr 21 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 PHP
Yii2简单实现给表单添加验证码的方法
Jul 18 PHP
php中final关键字用法分析
Dec 07 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
PHP赋值的内部是如何跑的详解
Jan 13 PHP
PHP实现文件上传后台处理脚本
Mar 04 PHP
Yii框架小部件(Widgets)用法实例详解
May 15 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
德生PL660的电路分析和打磨
2021/03/02 无线电
php实现中文转数字
2016/02/18 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
python笔记(2)
2012/10/24 Python
Python实现翻转数组功能示例
2018/01/12 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
户籍证明模板
2014/09/28 职场文书
文艺委员竞选稿
2015/11/19 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android