PHP中的单引号和双引号字符串有什么区别?


796

我有些困惑,为什么我在PHP中看到一些代码,这些代码的字符串用单引号引起来,有时用双引号引起来。

我只是在.NET或C语言中知道,如果用单引号引起来,则意味着它是一个字符,而不是字符串。

Answers:


1086

PHP字符串不仅可以通过两种方式指定,还可以通过四种方式指定。

  1. 用单引号引起来的字符串几乎可以完全“按原样”显示事物。变量和大多数转义序列将不被解释。唯一的例外是,要显示文字单引号,您可以使用反斜杠对其进行转义\',而要显示反斜杠,则可以使用另一个反斜杠对其进行转义\\因此,即使对单引号的字符串也进行了解析)。
  2. 双引号字符串将显示许多转义字符(包括一些正则表达式),并且将评估字符串中的变量。这里重要的一点是,您可以使用花括号来分隔要评估的变量的名称。例如,假设您有变量$type并且想要echo "The $types are"。那将寻找变量$types。要解决此问题,echo "The {$type}s are"您可以将左括号放在美元符号之前或之后。看一看字符串解析,看看如何使用数组变量等。
  3. Heredoc字符串语法的工作方式类似于双引号字符串。它以开头<<<。在此运算符之后,提供了一个标识符,然后提供了换行符。字符串本身紧随其后,然后再次使用相同的标识符关闭引号。您无需使用此语法对引号进行转义。
  4. Nowdoc(自PHP 5.3.0起)字符串语法的工作原理与单引号字符串相似。区别在于,甚至不必转义单引号或反斜杠。nowdoc的标识<<<顺序与Heredocs所用的序列相同,但是其后的标识符用单引号引起来,例如<<<'EOT'nowdoc不进行任何解析。

注意:必须对 单引号内的单引号和双引号内的双引号进行转义:

$string = 'He said "What\'s up?"';
$string = "He said \"What's up?\"";

速度:
我不会过多地强调单引号比双引号更快。在某些情况下,它们可能更快。这是一篇文章,说明自PHP 4.3起,单引号和双引号基本上一样快的一种方式Useless Optimizations朝底部,第一节C)。此外,此基准测试页面具有单引号与双引号的比较。大多数比较是相同的。有一个比较,双引号比单引号慢。


17
+1为花括号把戏。没意识到。太糟糕了,它没有遵循与Shell脚本相同的约定,即${variablename}
devios1 2013年

6
我只用双引号,当我需要双引号时\nPHP代码中的其他任何内容都用单引号引起来。
Jo Smo 2014年

似乎“ heredoc”是从bash移植到PHP的,不是吗?无论如何,很好的答案,所以+1谢谢。
sjsam,2015年

2
PHP文档注释中有趣的注释:php.net/manual/en/language.types.string.php#120160- “双引号字符串”看起来很慢,因为它们必须解析所有\ n反斜杠和$ dollar符号做变量扩展”,原来是PHP中最快速的字符串连接方法-PERIOD!单引号只有在您的字符串是完全文字的情况下才更快(其中没有要解析的内容,也没有要连接的内容),但是边距是很小,没关系。”
dregad '17

1
注意:"双引号的缓慢性几乎已成过去。如今,除极端情况外,更新已使双引号的处理速度变得如此之快。
SherylHohman

211

事物用双引号而不是单引号进行评估:

$s = "dollars";
echo 'This costs a lot of $s.'; // This costs a lot of $s.
echo "This costs a lot of $s."; // This costs a lot of dollars.

1
转义的单引号和转义的反斜杠甚至在单引号的字符串中也被扩展。
彼得·阿杰泰

43
许多不熟悉PHP的开发人员都在运行一个错误: $mailbody = 'I want a line break:\nDone.';保持\n生命。而:$mailbody = "I want a line break:\nDone.";将解析换行符。
Kai Noack

仅为了面试或恶意软件开发,就需要我两美分。只需比较两个表达式中的var_dump(): $testWithAsciiAndUtf8Characters = "\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!"; $simpleTest = '\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!'; 字符序列$testWithAsciiAndUtf8Characters被转换为带有真实字母的字符串。
罗斯蒂斯拉夫·皮利彭科

56

' 单引号

指定字符串的最简单方法是将其用单引号引起来。单引号通常更快,并且内部所有引用均视为纯字符串。

例:

echo 'Start with a simple string';
echo 'String\'s apostrophe';
echo 'String with a php variable'.$name;

" 双引号

在PHP中使用双引号可以避免在字符串中使用句点来分隔代码(注意:{}如果不想使用串联(.)运算符,请使用大括号将变量包括在内)。

例:

echo "Start with a simple string";
echo "String's apostrophe";
echo "String with a php variable {$name}";

PHP在性能上有单引号还是双引号?

是。使用单引号会稍微快一些。

PHP不会使用额外的处理来解释单引号内的内容。当使用双引号时,PHP必须解析以检查字符串中是否有任何变量。


单引号不解析字符串中的任何内容的一个例外是您可以用来在字符串\'中转义单个撇号(或\\'显示反斜杠)的方法。请注意,传统的转义序列(例如)\n不会解析为换行符。字符串上的PHP文档
SherylHohman

我在所有答案中都看到:您可以在双引号中使用变量的名称来打印出变量的值,但是您说的是,变量名称也应该用大括号括起来,以避免需要使用级联期。因此,如果“ $ my_var”和“ {$ my_var}”两者都输出$ my_var的值,则括号的作用是什么?谢谢!
巴赫曼。

40

单引号字符串中没有解释的变量。用双引号引起来的字符串。

同样,双引号字符串可以包含不带反斜杠的撇号,而单引号字符串可以包含未转义的引号。

单引号字符串在运行时速度更快,因为它们不需要解析。


8
单引号字符串也使用更少的内存。在PHP中处理字符串的最快方法是使用单引号并使用。运算符以连接字符串和变量。
RibaldEddie

嗯,如果我错了,请纠正我,但是PHP的基本语言是C,对吗?那么,为什么PHP和C中的字符串引号不同?
罗布·瓦明纳(Rob Waminal)2010年

1
@rob waminal:PHP可以用C实现,但这是另一种语言。PHP语言指定了这些语义。
Borealid

@Ribald-nowdoc语法会不会更快?解析单引号字符串以转义的单引号和反斜杠。
彼得·阿杰泰

@Peter,你可能是正确的,我从来没有真正去研究过它。PHP文档提出了速度方面的要求,我决定相信这些文档。:)
RibaldEddie

27

在PHP中,'my name'"my name"均为字符串。您可以在PHP手册中阅读有关它的更多信息。

你应该知道的是

$a = 'name';
$b = "my $a"; == 'my name'
$c = 'my $a'; != 'my name'

在PHP中,人们用单引号定义常量字符串,如'a''my name''abc xyz',同时使用双引号来定义一个字符串包含标识一样"a $b $c $d"

还有就是

echo 'my name';

echo "my name";

echo 'my ' . $a;

比慢

echo "my $a";

对于其他使用的字符串也是如此。


18

单引号,双引号,heredoc和nowdoc引号的示例

<?php

    $fname = "David";

    // Single quotes
    echo 'My name is $fname.'; // My name is $fname.

    // Double quotes
    echo "My name is $fname."; // My name is David.

    // Curly braces to isolate the name of the variable
    echo "My name is {$fname}."; // My name is David.

    // Example of heredoc
    echo $foo = <<<abc
    My name is {$fname}
    abc;

        // Example of nowdoc
        echo <<< 'abc'
        My name is "$name".
        Now, I am printing some
    abc;

?>

16

在PHP中,单引号文本被视为字符串值,而双引号文本将通过替换和处理它们的值来解析变量。

$test = "variable";
echo "Hello Mr $test"; // the output would be: Hello Mr variable
echo 'Hello Mr $test'; // the output would be: Hello Mr $test

此处,双引号解析值,单引号视为字符串值(不解析$test变量)。


12

两种封闭字符都是字符串。一种类型的引用可以方便地用于封装另一种类型的引用。 "'"'"'。引号类型之间的最大区别是,用封闭的标识符引用代替了双引号,而不是单引号。


3

在php中使用单引号和双引号之间的区别在于,如果我们在echo语句中使用单引号,则将其视为字符串。...但是,如果我们在双引号中输入变量名称,则它将输出该变量的值以及字符串。


0

在这里,单引号和双引号带有变量的一些可能性

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';

-1

一样东西:

请务必注意,带有Heredoc结束标识符的行除分号(;)外,不得包含其他任何字符。特别是这意味着标识符不能缩进,分号之前或之后可能没有空格制表符

例:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

1
这是一个真实的陈述,但与这里的问题无关。
miken32 '18

-1

也许我有点迟了,话题有点偏离了,但无论如何这里是这样:

由于字符串之间的内容,您不必选择:
alert("It's \"game\" time.");alert('It\'s "game" time.');

如果你熟悉与使用英文引号,并为撇号正确的字符,你可以使用双或单引号,因为它不会的事情了:
alert("It’s “game” time.");alert('It’s “game” time.');

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.