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会话(Session)实现用户登陆功能
Jun 29 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
PHP7常量数组用法分析
Sep 26 PHP
PHP小偷程序的设计与实现方法详解
Oct 15 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
Oct 10 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
Apr 15 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 PHP
php经典趣味算法实例代码
Jan 21 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 mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
php导出CSV抽象类实例
2014/09/24 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
JS高级笔记
2011/07/13 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
jQuery中first()方法用法实例
2015/01/06 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
python实现文本界面网络聊天室
2018/12/12 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
韩国11街:11STREET
2018/03/27 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
对孩子的寄语
2014/04/09 职场文书
公司捐款倡议书
2014/05/14 职场文书
Golang的继承模拟实例
2021/06/30 Golang
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS