PHP 单引号与双引号的区别(总结)

转自:https://www.jb51.net/article/21035.htm
看好多代码有时候用单引号或双引号实现包含字符串的内容,其实简单个概括下双引号中的变量可以解析,单引号就是绝对的字符串。
1、定义字符串   

在PHP中,字符串的定义可以使用单引号,也可以使用双引号。但是必须使用同一种单或双引号来定义字符串,如:‘Hello”和“Hello’为非法的字符串定义。   
定义字符串时,只有一种引号被视为定义符,即单引号或双引号。于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析。这样,你就可以在双引号串中包含任何其他字符,甚至单引号。下面的引号串都是合法的:
Php代码
复制代码 代码如下:

s=Iamasinglequotestringinsideadoublequotestring; s = “ I a m a ‘ s i n g l e q u o t e s t r i n g ′ i n s i d e a d o u b l e q u o t e s t r i n g ” ; s = ‘I am a “double quote string” inside a single quote string’;
s=Iamasinglequotestringinsideadoublequotestring; s = “ I a m a ‘ s i n g l e q u o t e s t r i n g ′ i n s i d e a d o u b l e q u o t e s t r i n g ” ; s = ‘I am a “double quote string” inside a single quote string’;   

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

2、字符串变量中的单、双引号  
 
PHP允许我们在双引号串中直接包含字串变量,我们可以发现下面的两个字串的处理结果是相同的。
复制代码 代码如下:

fullname= f u l l n a m e = first_name . ’ ’ . lastname; l a s t n a m e ; full_name = " firstname f i r s t n a m e last_name”;   

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

foo=2;echofoois f o o = 2 ; e c h o “ f o o i s foo”; // 打印结果: foo is 2
echo ‘foo is foo;//:foois f o o ′ ; / / 打 印 结 果 : f o o i s foo
echo “foo is foo\n;//:foois2()echofoois f o o \n ” ; / / 打 印 结 果 : f o o i s 2 ( 同 时 换 行 ) e c h o ‘ f o o i s foo\n'; // 打印结果: foo is foo\n f o o \n foo = 2;
echo “foo is foo;//:foois2echofoois f o o ” ; / / 打 印 结 果 : f o o i s 2 e c h o ‘ f o o i s foo'; // 打印结果: foo is fooechofoois f o o e c h o “ f o o i s foo\n”; // 打印结果: foo is 2 (同时换行)
echo ‘foo is foo\n;//:foois f o o \n ′ ; / / 打 印 结 果 : f o o i s foo\n   

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

echo “value = foo;echovalue= f o o ” ; e c h o “ v a l u e = a[ i];echovalue= i ] ” ; e c h o “ v a l u e = foo”;
echo “value = a[ a [ i]”;   

而下面的代码却不能得到我们希望的结果:
echo “value = a[ a [ i][ j]";// j ] " ; / / 我 们 希 望 打 印 二 维 数 组 a的某个元素。   
为避免这些字串使用中的潜在问题,我们通常把复杂的变量从字串中分离开来,就像这样:echo ‘value = ’ . a[ a [ i][ j];//(.)  :echovalue=$a[$i][$j]"// j ] ; / / 字 符 串 的 连 接 用 点 ( . )     还 有 一 种 办 法 是 将 复 杂 变 量 用 花 括 号 括 起 来 , 语 法 分 析 器 就 能 正 确 辨 认 了 : e c h o “ v a l u e = $ a [ $ i ] [ $ j ] " / / 打 印 二 维 数 组 a的某个元素   

3、在SQL语句中  
 
这是会经常遇到的问题,在插入数据库的SQL语句是采用单引号来定义字符串,如果要将一个含有单引号的字符串插入数据库,这个SQL语句就会出错。
如: sql=insertintouserinfo(username,password)Values(OKefee,123456)  SQL线Values(O\’Kefee,  使addslashes() s q l = ” i n s e r t i n t o u s e r i n f o ( u s e r n a m e , p a s s w o r d ) V a l u e s ( ‘ O ′ K e f e e ′ , ′ 123456 ′ ) ”     此 时 , 处 理 的 方 法 之 一 是 在 S Q L 语 句 中 加 入 转 义 符 反 斜 线 , 即 : … … V a l u e s ( ‘ O \’ K e f e e ′ , … …     当 然 也 可 以 使 用 函 数 a d d s l a s h e s ( ) , 该 函 数 的 功 能 就 是 加 入 转 义 符 , 即 : s = addslashes("O'Kefee") ……Values('".$s.”’,……   
还有一种方法是设置php.ini中的magic-quotes选项,打开该选项,则通过表单提交的信息中如果有单引号是,将会自动加上如转义符。因此不用使用其他函数了。
补充: 这就要从双引号和单引号的作用讲起: 双引号里面的字段会经过编译器解释然后再当作HTML代码输出,但是单引号里面的不需要解释,直接输出。
例如:
复制代码 代码如下:

abc=Iloveu;echo a b c = ′ I l o v e u ′ ; e c h o abc //结果是:I love u
echo ‘ abc//: a b c ′ / / 结 果 是 : 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=selectfromtablewhereuser=. u s e r = ′ a b c ′ ; S Q L 1 = ” s e l e c t ∗ f r o m t a b l e w h e r e u s e r = ′ “ . user.” ’ “;对比一下
SQL2=”select * from table where user=’ abc ’ ”

我把单引号和双引号之间多加了点空格,希望你能看的清楚一点。
也就是把’abc’ 替换为 ‘”. user.SQLSQL131selectfromtablewhereuser=2 u s e r . ” ′ 都 是 在 一 个 单 引 号 里 面 的 。 只 是 把 整 个 S Q L 字 符 串 分 割 了 。 S Q L 1 可 以 分 解 为 以 下 3 个 部 分 1 : ” s e l e c t ∗ f r o m t a b l e w h e r e u s e r = ′ ” 2 : user
3:” ’ ”
字符串之间用 . 来连接,这样能明白了吧。

一、引号定义字符串

  在PHP中,通常一个字符串被定义在一对引号中,如:
‘I am a string in single quotes’
“I am a string in double quotes”
  PHP语法分析器是用成对的引号来判断一个字符串的。因此,所有字符串必须使用同一种单或者双
引号来定义开始和结束。例如,下面的字串定义是不合法的:
“I am not a valid string since I have unmatching quote marks’
‘Me neither!”
  定义字符串时,只有一种引号被视为定义符,即单引号或双引号。于是,如果一个字符串由双引
号开始,那么只有双引号被分析器解析。这样,你就可以在双引号串中包含任何其他字符,甚至单引
号。下面的引号串都是合法的:
s=Iamasinglequotestringinsideadoublequotestring; s = “ I a m a ‘ s i n g l e q u o t e s t r i n g ′ i n s i d e a d o u b l e q u o t e s t r i n g ” ; s = ‘I am a “double quote string” inside a single quote string’;
  当PHP遇到与串的开头相对应的引号时,便认为已经到了字符串尾部,于是:
“Why doesn’t “this” work?”
  实际上被PHP语法分析器分成三个部分:
“Why doesn’t “——包含一个单引号的双引号串
this——多余的字符,分析器无法处理
” work?” ——普通字符串
  上面的这个例子企图在双引号串中包含双引号,而分析器在遇到第二个双引号时便认为字符串结
束了。要达到包含引号的目的,必须分析器在遇到串内普通引号的时候忽略它的原意,我们在引号的
前面加上一个反斜杠来告诉PHP:这个引号是字符串的一部分,正确的表示方法是这样:
“Why doesn’t \”that\” work?”
  在英文字符串中一个常见的问题是撇号’的使用,因为它就是一个单引号,而在英文串中十分常见
(英文所有格)。你必须小心处理这些字符:
‘You\’d better escape your apostrophes’
  可以看到反斜杠在字符串中有他的特殊含义,当我们需要在字符串中包含反斜杠本身时,需要在
该符号前面多加一个反斜杠。例如:
file=c:\windows\system.ini;echo f i l e = “ c : \windows \system . i n i ” ; e c h o file; // 打印结果为: c:windowssystem.ini
file=c:\windows\system.ini;echo f i l e = “ c : \windows \system . i n i ” ; e c h o file; // 打印结果为: c:\windows\system.ini
  另一种字符串定义方式,能够消除特殊字符的烦恼,而且便于引用较长的文本。该字符串定义方
法以<<<符号紧跟一个自定义字符串开头,最后一行以该自定义字符串结束,并且必须顶格。

二、字串的连接

  字串可以使用字串连接符(.)来连接,如:
firstname=Charlie; f i r s t n a m e = ‘ C h a r l i e ′ ; last_name = ‘Brown’;
fullname= f u l l n a m e = first_name . ’ ’ . lastname;  HTML(=)(.)(.=) l a s t n a m e ;     常 见 的 用 途 是 建 立 大 块 的 H T M L 字 串 代 码 , 赋 值 号 ( = ) 连 接 符 ( . ) 可 以 被 简 写 合 并 为 ( . = ) 符 号 , 如 : html = ‘

‘;
html.=;for( h t m l . = ‘ ‘ ; f o r ( i=0 ; i<10; i < 10 ; i++) {
square= s q u a r e = i * i; i ; html .= '' . i . ‘’;   
}
i . ‘’;   }
html .= ‘
number square
’ . $square . ‘
‘;

三、在字串中使用变量

  这个功能让你无须使用连接符号来粘和大量的简单字符串。PHP允许我们在双引号串中直接包含字
串变量,我们可以发现下面的两个字串的处理结果是相同的。
fullname= f u l l n a m e = first_name . ’ ’ . lastname; l a s t n a m e ; full_name = " firstname f i r s t n a m e last_name”;
  单引号串和双引号串在PHP中的处理是不相同的。双引号串中的内容可以被解释而且替换,而单引
号串中的内容总被认为是普通字符。例如:
foo=2;echofoois f o o = 2 ; e c h o “ f o o i s foo”; // 打印结果: foo is 2
echo ‘foo is foo;//:foois f o o ′ ; / / 打 印 结 果 : f o o i s foo
echo “foo is foo\n;//:foois2()echofoois f o o \n ” ; / / 打 印 结 果 : f o o i s 2 ( 同 时 换 行 ) e c h o ‘ f o o i s foo\n'; // 打印结果: foo is foo\n  \\’\n使使PHP  echovalue= f o o \n     正 如 你 所 看 到 的 , 在 单 引 号 串 中 甚 至 反 斜 杠 也 失 去 了 他 的 扩 展 含 义 ( 除 了 插 入 反 斜 杠 \和 插 入 单 引 号 \’ ) 。 所 以 , 当 你 想 在 字 串 中 进 行 变 量 代 换 和 包 含 \n ( 换 行 符 ) 等 转 义 序 列 时 , 你 应 该 使 用 双 引 号 。 单 引 号 串 可 以 用 在 其 他 任 何 地 方 , 脚 本 中 使 用 单 引 号 串 处 理 速 度 会 更 快 些 , 因 为 P H P 语 法 分 析 器 对 单 引 号 串 的 处 理 方 式 比 较 单 纯 , 而 双 引 号 的 处 理 由 于 串 内 部 也 需 要 解 析 , 因 此 更 复 杂 些 , 所 以 处 理 速 度 略 慢 。     在 字 符 串 中 引 用 复 杂 的 变 量 组 合 时 , 可 能 会 产 生 一 些 问 题 , 下 面 的 代 码 会 正 常 工 作 : e c h o “ v a l u e = foo”;
echo “value = a[ a [ i]”;
  而下面的代码却不能得到我们希望的结果:
echo “value = a[ a [ i][ j]";// j ] " ; / / 我 们 希 望 打 印 二 维 数 组 a的某个元素。
  为避免这些字串使用中的潜在问题,我们通常把复杂的变量从字串中分离开来,就像这样:
echo ‘value = ’ . a[ a [ i][ j];  :echovalue=$a[$i][$j]"// j ] ;     还 有 一 种 办 法 是 将 复 杂 变 量 用 花 括 号 括 起 来 , 语 法 分 析 器 就 能 正 确 辨 认 了 : e c h o “ v a l u e = $ a [ $ i ] [ $ j ] " / / 打 印 二 维 数 组 a的某个元素
  这样,又出现新问题了。当我们想在字串中引用花括号字符本身时,就要记得使用转义符了:
var = 3;   
echo “value = {
var = 3;   echo “value = {
var}”; // 打印结果 “value = 3”
echo “value = {var}”; // 打印结果 “value = {3}”   
由于转义字符对{}进行了其他处理\p{xx},不适用此例,可以如下代替:  
var_dump(“value = {“.
var}”; // 打印结果 “value = {3}”   由于转义字符对{}进行了其他处理\p{xx},不适用此例,可以如下代替:  var_dump(“value = {“.
var.”}”) ; // 打印结果 “value = {3}”

三、斜杠和SQL语句

  生成HTML代码或SQL查询语句是编写PHP程序时经常遇到而且是件有趣的事情。为什么这么说呢,
因为这涉及到生成另外一种类型的代码,你必须仔细地考虑和遵循这种代码所要求的编写语法和规
则。
  我们来看这样一个例子,假如你想查询数据库中名字是“O’Keefe”的用户,通常SQL语句的形式
是这样的:
select * from users where last_name = ‘O\’Keefe’
  请注意SQL语句这个英文所有格(撇号)需使用反斜杠转义。PHP专门提供了一些函数来处理这样
的情况,函数AddSlashes( str) s t r ) 的 用 途 就 是 自 动 在 字 串 中 对 引 号 字 符 插 入 反 斜 杠 转 义 符 : last_name = “O’Keefe”;
sql="selectfromuserswherelastname=".addslashes( s q l =" s e l e c t ∗ f r o m u s e r s w h e r e l a s t n a m e = ′ " . a d d s l a s h e s ( last_name) . “’”;
  在这个例子中,你还要在last_name字串外面括上单引号(SQL语法要求),由于这里使用的是双
引号串,所以对这对单引号就无须使用转义了。下面的这个语句是使用单引号串的等价形式:
sql=selectfromuserswherelastname=\'.addslashes( s q l = ′ s e l e c t ∗ f r o m u s e r s w h e r e l a s t n a m e = \' ′ . a d d s l a s h e s ( last_name) . ‘\”;
  任何时候你要在数据库中写入字串,你都必须确保里面的引号正确使用了转义符号,这是很多PHP
初学者常犯的错误。

四、双引号和HTML

  与SQL语句不同,在标准HTML语言中双引号常被用来表示字串(现在很多浏览器具备较强的容错功
能,允许在HTML中用单引号甚至不用引号表示字符串),例如:
html=<ahref=". h t m l = ′ < a h r e f = " ′ . url.’”>’. link.′′; l i n k . ″ ; html = "