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 define函数的使用说明
Aug 27 PHP
PHP CLI模式下的多进程应用分析
Jun 03 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
Jun 27 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
ThinkPHP之getField详解
Jun 20 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
CodeIgniter中使用Smarty3基本配置
Jun 29 PHP
php图像处理类实例
Jul 28 PHP
PHP CURL中传递cookie的方法步骤
May 09 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
2016/08/23 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
js select option对象小结
2013/12/20 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Python 的 with 语句详解
2014/06/13 Python
TensorFlow变量管理详解
2018/03/10 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
UNIX文件系统常用命令
2012/05/25 面试题
银行毕业实习自我鉴定
2013/09/19 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
新闻发布会策划方案
2014/06/12 职场文书
门面房租房协议书
2014/08/20 职场文书
运动会5000米加油稿
2015/07/21 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
Redis三种集群模式详解
2021/10/05 Redis