再谈PHP中单双引号的区别详解


Posted in PHP onJune 12, 2016

在PHP中,字符串的定义可以使用英文单引号' ‘,也可以使用英文双引号” “。

但是必须使用同一种单或双引号来定义字符串,如:'Hello World”和”Hello World'为非法的字符串定义。

单引号和双引号到底有啥区别呢?下面通过本文学习一下吧。

1、定义字符串  

在PHP中,字符串的定义可以使用单引号,也可以使用双引号。但是必须使用同一种单或双引号来定义字符串,如:‘Hello"和“Hello'为非法的字符串定义。


定义字符串时,只有一种引号被视为定义符,即单引号或双引号。于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析。这样,你就可以在双引号串中包含任何其他字符,甚至单引号。下面的引号串都是合法的:

Php代码

$s = "I am a 'single quote string' inside a double quote string"; 
$s = 'I am a "double quote string" inside a single quote string'; 
$s = "I am a 'single quote string' inside a double quote string"; 
$s = 'I am a "double quote string" inside a single quote string';  

 而串 "Why doesn't "this" work?" 则会被分为三段。如果在这个串中想要表示出双引号,则可以使用转义符"\"(反斜线),变成 "Why doesn't \"this\" work?" 即可。

2、字符串变量中的单、双引号

PHP允许我们在双引号串中直接包含字串变量,我们可以发现下面的两个字串的处理结果是相同的。

$full_name = $first_name . ' ' . $last_name; 
$full_name = "$first_name $last_name";

单引号串和双引号串在PHP中的处理是不相同的。双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。例如:

Php代码

$foo = 2; 
echo "foo is $foo"; // 打印结果: foo is 2 
echo 'foo is $foo'; // 打印结果: foo is $foo 
echo "foo is $foo\n"; // 打印结果: foo is 2 (同时换行) 
echo 'foo is $foo\n'; // 打印结果: foo is $foo\n 
$foo = 2; 
echo "foo is $foo"; // 打印结果: foo is 2 
echo 'foo is $foo'; // 打印结果: foo is $foo 
echo "foo is $foo\n"; // 打印结果: foo is 2 (同时换行) 
echo 'foo is $foo\n'; // 打印结果: foo is $foo\n  

正如你所看到的,在单引号串中甚至反斜杠也失去了他的扩展含义(除了插入反斜杠\\和插入单引号\')。所以,当你想在字串中进行变量代换和包 含\n(换行符)等转义序列时,你应该使用双引号。单引号串可以用在其他任何地方,脚本中使用单引号串处理速度会更快些,因为PHP语法分析器对单引号串 的处理方式比较单纯,而双引号的处理由于串内部也需要解析,因此更复杂些,所以处理速度略慢。

在字符串中引用复杂的变量组合时,可能会产生一些问题,下面的代码会正常工作:

Php代码

echo "value = $foo"; 
echo "value = $a[$i]"; 
echo "value = $foo"; 
echo "value = $a[$i]";

而下面的代码却不能得到我们希望的结果:

echo "value = $a[$i][$j]"; //我们希望打印二维数组$a的某个元素。

为避免这些字串使用中的潜在问题,我们通常把复杂的变量从字串中分离开来,就像这样:echo 'value = ' . $a[$i][$j];//字符串的连接用点(.)

还有一种办法是将复杂变量用花括号括起来,语法分析器就能正确辨认了:

echo "value = {$a[$i][$j]}" //打印二维数组$a的某个元素

这样,又出现新问题了。当我们想在字串中引用花括号字符本身时,就要记得使用转义符了:

Php代码

$var = 3; 
echo "value = {$var}"; // 打印结果 "value = 3" 
echo "value = \{$var}"; // 打印结果 "value = {3}" 
$var = 3; 
echo "value = {$var}"; // 打印结果 "value = 3" 
echo "value = \{$var}"; // 打印结果 "value = {3}"

3、在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代码输出,但是单引号里面的不需要解释,直接输出。

例如:

$abc='I love u'; 
echo $abc //结果是:I love u 
echo '$abc' //结果是:$abc 
echo "$abc" //结果是:I love u

所以在对数据库里面的SQL语句赋值的时候也要用在双引号里面SQL="select a,b,c from ..." 但是SQL语句中会有单引号把字段名引出来

例如:

select * from table where user='abc';

这里的SQL语句可以直接写成SQL="select * from table where user='abc'"

但是如果象下面:

$user='abc'; 
SQL1="select * from table where user=' ".$user." ' ";对比一下 
SQL2="select * from table where user=' abc ' "

我把单引号和双引号之间多加了点空格,希望你能看的清楚一点。

也就是把'abc' 替换为 '".$user."'都是在一个单引号里面的。只是把整个SQL字符串分割了。 SQL1可以分解为以下3个部分

1:"select * from table where user=' "

2:$user

3:" ' "

字符串之间用 . 来连接,这样能明白了吧。

以上所述是小编给大家介绍的PHP中单双引号的区别详解,希望对大家有所帮助,如果大家想了解更多内容敬请关注三水点靠木网站!

PHP 相关文章推荐
PHP 选项及相关信息函数库
Dec 04 PHP
PHP游戏编程25个脚本代码
Feb 08 PHP
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
支持中文字母数字、自定义字体php验证码代码
Feb 27 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
Apr 24 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php给图片加文字水印
Jul 31 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
Sep 23 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
php多进程应用场景实例详解
Jul 22 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 #PHP
linux下php上传文件注意事项
Jun 11 #PHP
php设计模式之单例模式代码
Jun 11 #PHP
浅谈PHP Cookie处理函数
Jun 10 #PHP
php单例模式的简单实现方法
Jun 10 #PHP
PHP操作mysql数据库分表的方法
Jun 09 #PHP
浅谈PHP链表数据结构(单链表)
Jun 08 #PHP
You might like
PHP 函数语法介绍一
2009/06/14 PHP
PHP学习 变量使用总结
2011/03/24 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
2015/12/28 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
python3+PyQt5实现柱状图
2018/04/24 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
Python实战购物车项目的实现参考
2019/02/20 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
会话Bean的种类
2013/11/07 面试题
施工工地安全标语
2014/06/07 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
优秀班组事迹材料
2014/12/24 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android