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
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
PHP初学者最感迷茫的问题小结
Mar 27 PHP
发一个php简单的伪原创程序,配合商城采集用的
Oct 12 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
一个简洁实用的PHP缓存类完整实例
Jul 26 PHP
php购物车实现方法
Jan 03 PHP
PHP程序员的技术成长规划
Mar 25 PHP
php文件上传类完整实例
May 14 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
laravel migrate初学常见错误的解决方法
Oct 11 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遍历文件夹和文件列表示例分享
2014/03/11 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
jquery中ajax学习笔记4
2011/10/16 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
常用的js方法合集
2017/03/10 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
python 实现音频叠加的示例
2020/10/29 Python
python 模拟登陆163邮箱
2020/12/15 Python
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
本科毕业生自我鉴定
2013/11/02 职场文书
2014年科室工作总结
2014/11/20 职场文书
小学生毕业评语
2014/12/26 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
刑事上诉状范文
2015/05/22 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
OpenCV-Python实现轮廓的特征值
2021/06/09 Python