深入详谈PHP单引号和双引号区别

在PHP中单引号和双引号并非是互通的,具体区别如下:

” ” 双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。

‘ ‘ 单引号里面的不进行解释,直接输出。

从字面意思上就可以看出,单引号比双引号要快了。

例如:

$abc=’my name is tome’;
echo $abc //结果是:my name is tom
echo ‘$abc’ //结果是:$abc
echo “$abc” //结果是:my name is tom

在SQL语句中  
 
这是会经常遇到的问题,在插入数据库的SQL语句是采用单引号来定义字符串,如果要将一个含有单引号的字符串插入数据库,这个SQL语句就会出错。
如:$sql="insert into userinfo (username,password) Values('O'Kefee','123456')"   
此时,处理的方法之一是在SQL语句中加入转义符反斜线,
即:……Values('O\'Kefee',……   
当然也可以使用函数 addslashes(),该函数的功能就是加入转义符,
即:$s = addslashes("O'Kefee") ……Values('".$s."',……   
还有一种方法是设置php.ini中的magic-quotes选项,打开该选项,则通过表单提交的信息中如果有单引号是,将会自动加上如转义符。因此不用使用其他函数了。
补充: 这就要从双引号和单引号的作用讲起: 双引号里面的字段会经过编译器解释然后再当作HTML代码输出,但是单引号里面的不需要解释,直接输出。

$val ='a';

sql =" select * from table where name like '%$val%'"; //将自动替换里面的$val,但如果要用单引号来组织语句则表示为:
sql =' select * from table where name like \'%'.$val.'%\''; //麻烦很多

 
但用单引号代替双引号来包含字符串,这样做会更快一些,因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。

假设查询条件中使用的是常量,例如:

select * from abc_table where user_name=’abc’;
SQL语句可以写成:
SQLstr = “select * from abc_table where user _name= ‘abc’” ;
假设查询条件中使用的是变量,例如:
$user_name = $_REQUEST['user_name']; //字符串变量

$user=array (”name”=> $_REQUEST['user_name‘,"age"=>$_REQUEST['age'];//数组变量
SQL语句就可以写成:
SQLstr = “select * from abc_table where user_name = ‘ ” . $user_name . ” ‘ “;
SQLstr = “select * from abc_table where user_name = ‘ ” . $user["name"] . ” ‘ “;
对比一下:
SQLstr=”select * from abc_table where user_name = ‘ abc ‘ ” ;
SQLstr=”select * from abc_table where user_name =’ ” . $user _name . ” ‘ “;
SQLstr=”select * from abc_table where user_name =’ ” . $user["name"] . ” ‘ “;
SQLstr可以分解为以下3个部分:
1:”select * from table where user_name = ‘ ” //固定SQL语句
2:$user //变量
3:” ‘ ”
1,2,3部分字符串之间用”.” 来连接

PHP效率计:从引号开始(单引号、双引号效率区别)

实验一:在普通情况下的效率
我们的实验是5000次执行10000个字节的文件,获得解析过程中的速度。
首先,本实验特别规定一个单位,这是为了更好地表示以及排除计算机本身效率的差异。
时间单位 TT,表示约 7.2×10[sup]-8[/sup]s 。
我们获得四组实验数据,可理解为表示 'a' 比 "a" 快的时间:
         0.29 TT,大概0.0000000206s
         0.46 TT,大概0.0000000328s
         0.38 TT,大概0.0000000275s
         0.41 TT,大概0.0000000292s
平均值:0.39 TT ('aaaa....(139个)' 的效率接近于 "aaa...(100个)" )
结论:在数据量相同,并且在普通情况下(不借助转义),使用单引号速度更快。

实验二:单引号转义的效率
我们的实验是5000次分别以「单引号、双引号」执行两份数据相同,但其中一份特别用\'表示单引号。
时间单位 TT,表示约 7.2×10[sup]-8[/sup]s 。
我们获得四组实验数据,可理解为表示 " ' " 比 ' \' ' 快的时间:
         0.19 TT,大概0.0000000138s
         0.15 TT,大概0.0000000110s
         0.23 TT,大概0.0000000162s
         0.24 TT,大概0.0000000173s
平均值:0.2 TT (” ''''...(12个) " 的效率接近于 ' \'\'...(10个)" )
结论:如果字符串中需要表示单引号(MySQL查询),应尽可能避免转义,所以应使用双引号。
实验三:花括号的效率
我们的实验是1000次执行含有数量一定的变量标记的文件,获得解析过程中的速度。
时间单位 TT,表示约 1.581×10[sup]-7[/sup]s~1.666×10[sup]-7[/sup]s 。(TT 变化)
得到三组数据,表示 "{$abc}" 比 "$abc" 快。
       15.3 TT,大概0.0000024186s
       14.5 TT,大概0.0000024093s
       15.3 TT,大概0.0000024152s
这数据是十分惊人的,平均结果 15 TT。
这意味着:使用花括号的解析速度,大约是不使用花括号的16倍。
结论:在双引号中表示变量,尽可能使用花括号。

实验四:连续与非连续的效率
我们的实验是1000次执行含有数量一定的变量标记的文件,获得解析过程中的速度。
时间单位 TT,表示约 1.581×10[sup]-7[/sup]s~1.666×10[sup]-7[/sup]s 。(TT 变化)
第一组实验数据,表示 "{$abc}{$abc}{$abc}..." 比 $abc.$abc.$abc 平均每个变量解析快
       22.45 TT,大概0.0000035498s
       21.03 TT,大概0.0000035037s
       22.12 TT,大概0.0000034930s
       花括号(连续)比单引号(非连续)快的时间,平均结果 22 TT。
       这意味着:使用花括号的解析速度,大约是使用不连续的单引号的23倍。
       结论:在单引号中表示多个变量(或数据总量少),尽可能换用双引用,并使用花括号。
第二组实验数据,表示 "...$abc$abc$abc..." 比 ‘...’.$abc.$abc.$abc.'...' 平均每个变量解析快
       7.15 TT,大概0.0000011311s
       6.57 TT,大概0.0000010943s
       6.83 TT,大概0.0000010777s
       双引号(连续)比单引号(非连续)快的时间,平均结果 7 TT。(该数据变化)
       这意味着:变量多时,使用双引号(不使用花括号)的解析速度,大约是使用不连续的单引号的8倍。
       结论:在双引号中表示多个变量(或数据总量少),比使用单引号而需要用「连接运算符」要快。
结论:表示多个变量时(或数据总量少),应可能范围内使用双引号,并使用花括号。
(附:作者推测,这可能和内存空间的分配有关系,连续符可能会使内存不断调整)

最终结论:
首先,表示简单的数据时(不需要转义),尽量用单引号。
   'Cal: Are you good at long jump?'
但如果因为使用单引号,而需要进行转义(即包含单引号),考虑使用双引号。
   'Cal: Yes. But, you know, it\'s written.' => "Cal: Yes. But, you know, it's written."
如果需要表示变量,应尽量使用花括号。
   "Cal: $to" => "Cal: {$to}, you shouldn't go shopping."
尽量使其连续:
   'Cal: '.$calsaid => "Cal: $calsaid" => "Cal: {$calsaid}"

时间: 2024-12-28 16:54:46

深入详谈PHP单引号和双引号区别的相关文章

grep后加单引号、双引号和不加引号的区别

环境:VirtualBox4.1 + RedHat Linux 6 + Putty0.62 单引号: 可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里 面看到的是什么就会输出什么.单引号''是全引用,被单引号括起的内容不管是 常量还是变量者不会发生替换. 双引号: 把双引号内的内容输出出来:如果内容中有命令.变量等,会先把变量.命 令解析出结果,然后在输出最终内容来.双引号""是部分引用,被双 引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容. 不加引号:

linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)(转)

tips: ============================= IFS - LINUX字段分隔符,内部字段分隔符 IFS(Internal Field Seperator)在Linux的shell中预设的分隔符,用来把command line分解成word(字段). IFS可以是White Space(空白键).Tab( 表格键).Enter( 回车键)中的一个或几个. IFS是shell脚本中的一个重要概念,在处理文本数据时,它是相当有用的.内部字段分隔符是用于特定用途的定界符.IFS

PHP 单引号与双引号的区别_php技巧

1.定义字符串 在PHP中,字符串的定义可以使用单引号,也可以使用双引号.但是必须使用同一种单或双引号来定义字符串,如:'Hello"和"Hello'为非法的字符串定义. 定义字符串时,只有一种引号被视为定义符,即单引号或双引号.于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析.这样,你就可以在双引号串中包含任何其他字符,甚至单引号.下面的引号串都是合法的: Php代码 复制代码 代码如下: $s = "I am a 'single quote string' i

关于在JavaScript中使用EL表达式的问题,到底用不用加单引号或者双引号或者不加?

问题描述 关于在JavaScript中使用EL表达式的问题,到底用不用加单引号或者双引号或者不加? 之前我自己编辑百度地图api时候,EL表达式是直接写的,但是并不能使用. 当时我在csdn上找到了如下这篇文章,说是要加引号.http://blog.csdn.net/xuechongyang/article/details/8629473然后就成功了. 比如下代码的最后一句. <script type=""text/javascript""> // 百度

sql 插入语句单引号和双引号问题

问题描述 sql 插入语句单引号和双引号问题 ![ 这两句语句都对吗? 解决方案 java拼sql串用双引号,sql语句里用单引号 解决方案二: SQL中的单引号和双引号sql 那些单引号双引号关于SQL 中的单引号和双引号 解决方案三: 双引号那句编译不了,双引号没加上反斜杆注明.

浅析Js中的单引号与双引号问题_javascript技巧

单引号和双引号其实没啥区别,看你自己习惯了 <input type="button" onclick="alert("1")">-------------------不正确<input type="button" onclick="alert('1')">-------------------正确 双引号中再用双引号要这样:var str = "abc\"def\

Js参数值中含有单引号或双引号问题的解决方法_javascript技巧

<script type="text/javascript">function Display(LoginEmail, UserName, ID) {        alert(LoginEmail);    }</script> 1.使用单引号传参:<a href="javascript:Display('abc@abc.com','Aleax Xie','10101239393')">Test1</a> 如果其中一

由注册用户名不能使用单引号和双引号引发的思考

             机房收费系统敲完很久了,也很久没有在CSDN上写博客了.关于机房收费系统能写的东西很多,同期的也写了很多.在测试机房收费系统时如果用户名里含有单引号或者双引号时,每次系统都会报错或者崩溃.         究其原因是我们目前写的查询语句一般如下:         StrSQL="select * from Student_Info where UserName='" & Trim(txtUserName.text) & "'"

插入语句单引号和双引号的问题

问题描述 stringsql="insertinto图书信息表(条码,ISBN,产品形式,题名,题名拼音,出版社ID)"+"values('"+textBox1.Text+"','"+textBox2.Text+"','"+textBox3.Text.Trim()+"','"+textBox4.Text.Trim()+"',"+"'"+textBox5.Text.Tr