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提取视频网站页面中的FLASH地址的代码
Apr 17 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
php导出生成word的方法
Dec 25 PHP
symfony2.4的twig中date用法分析
Mar 18 PHP
thinkPHP5.0框架安装教程
Mar 25 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
laravel 解决强制跳转 https的问题
Oct 22 PHP
laravel邮件发送的实现代码示例
Jan 31 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
Yii框架安装简明教程
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
php print EOF实现方法
2009/05/21 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
python 中if else 语句的作用及示例代码
2018/03/05 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
python pymysql库的常用操作
2020/10/16 Python
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
2014年计生标语
2014/06/23 职场文书
事业单位聘任报告
2015/03/02 职场文书
会议室使用管理制度
2015/08/06 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
PHP实现考试倒计时功能代码
2021/04/16 PHP
vue中data里面的数据相互使用方式
2022/06/05 Vue.js