PHP的单引号和双引号 字符串效率
2015-01-24信息快讯网
经常有人问我,听说在PHP中处理字符串用单引号会快,那么如果存在变量替换的时候,是使用单引号连接快呢,还是双引号快呢?
简单的回答,显然是苍白无力的。 今天我们来做个实验,看看到底单引号和双引号有什么区别,谁快,谁慢。测试代码如下:
<?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下尝试使用GraphicsMagick的缩略图功能
PHP读取XML值的代码(推荐)
PHP中simplexml_load_string函数使用说明
php xml 入门学习资料
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
学习php笔记 字符串处理
php下清空字符串中的HTML标签的代码
PHP下对字符串的递增运算代码
PHP 截取字符串专题集合
php 输出双引号"与单引号'的方法
PHP 单引号与双引号的区别
php 字符过滤类,用于过滤各类用户输入的数据
php session 错误
php print EOF实现方法
php 方便水印和缩略图的图形类
简单的php 验证图片生成函数
PHP 数组入门教程小结
PHP 错误之引号中使用变量
PHP 字符串编码截取函数(兼容utf-8和gb2312)
PHP mb_convert_encoding 获取字符串编码类型实现代码
PHP 截取字符串 分别适合GB2312和UTF8编码情况
中英文字符串翻转函数
php在字符串中查找另一个字符串
php下防止单引号,双引号在接受页面转义的设置方法
php 防止单引号,双引号在接受页面转义