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的cURL快速入门教程 (小偷采集程序)
Jun 02 PHP
浅析memcache启动以及telnet命令详解
Jun 28 PHP
Php-Redis安装测试笔记
Mar 05 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
PHP对XML内容进行修改和删除实例代码
Oct 26 PHP
php cookie用户登录的详解及实例代码
Jan 03 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
php实现文件上传及头像预览功能
Jan 15 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 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 feof用来识别文件末尾字符的方法
2010/08/01 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
python3简单实现微信爬虫
2015/04/09 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
python并发和异步编程实例
2018/11/15 Python
Python中的枚举类型示例介绍
2019/01/09 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
致标枪运动员加油稿
2014/02/15 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
2015年教研员工作总结
2015/05/26 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书