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字符串截取中文截取2,单字节截取模式
Dec 10 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
Apr 25 PHP
php 将字符串按大写字母分隔成字符串数组
Apr 30 PHP
php检测iis环境是否支持htaccess的方法
Feb 18 PHP
php多任务程序实例解析
Jul 19 PHP
php中10个不同等级压缩优化图片操作示例
Nov 14 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
php中通用的excel导出方法实例
Dec 30 PHP
php与阿里云短信接口接入操作案例分析
May 27 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加密解密的代码
2007/07/16 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
利用jQuery的$.event.fix函数统一浏览器event事件处理
2009/12/21 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
vue中echarts3.0自适应的方法
2018/02/26 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
python装饰器实例大详解
2017/10/25 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
python实现顺时针打印矩阵
2019/03/02 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
写给爸爸的道歉信
2014/01/15 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
办公室主任职责范本
2014/03/07 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
关于python爬虫应用urllib库作用分析
2021/09/04 Python
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript