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

What is the difference between single-quoted and double-quoted strings in PHP?

提问人:rob waminal 提问时间:8/10/2010 最后编辑:Manuel Mannhardtrob waminal 更新时间:2/13/2023 访问量:470034

问:

我有点困惑为什么我在 PHP 中看到一些代码将字符串放在单引号中,有时放在双引号中。

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

PHP 字符串 语法

评论


答:

44赞 Borealid 8/10/2010 #1

单引号字符串中没有解释其中的变量。双引号字符串可以。

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

评论

10赞 RibaldEddie 8/10/2010
单引号字符串也使用较少的内存。在 PHP 中处理字符串的最快方法是使用单引号并使用 .运算符来连接字符串和变量。
0赞 rob waminal 8/10/2010
嗯,如果我错了,请纠正我,但 PHP 的基本语言是 C,对吧?那么为什么 PHP 和 C 中的字符串引号不同呢?
2赞 Borealid 8/10/2010
@rob waminal:PHP 可以用 C 实现,但它是一种不同的语言。PHP 语言指定了这些语义。
0赞 Peter Ajtai 8/10/2010
@Ribald - nowdoc 语法不是更快吗?单引号字符串被解析为转义的单引号和反斜杠。
1赞 Your Common Sense 2/13/2023
@RibaldEddie现在这是新事物。有什么证据吗?
13赞 wallyk 8/10/2010 #2

这两种括起来的字符都是字符串。一种类型的报价可以方便地用于包含另一种类型的报价。 和。引号类型之间的最大区别在于,括起来的标识符引用被替换为双引号内,而不是单引号内。"'"'"'

250赞 Daniel 8/10/2010 #3

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

$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赞 Peter Ajtai 8/10/2010
即使在单引号字符串中,转义的单引号和转义的反斜杠也会扩展。
52赞 Avatar 4/18/2014
许多刚接触PHP的开发人员都犯了一个错误:保持活力。Whereas: 将解析换行符。$mailbody = 'I want a line break:\nDone.';\n$mailbody = "I want a line break:\nDone.";
2赞 Rostyslav Pylypenko 11/20/2018
我的两分钱只需要用于面试或恶意软件开发。只需比较两个表达式中的 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
37赞 Bang Dao 8/10/2010 #4

在 PHP 中,和都是字符串。您可以在 PHP 手册中阅读更多相关信息。'my name'"my name"

你应该知道的事情是

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

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

1230赞 Peter Ajtai 8/10/2010 #5

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

  1. 单引号字符串将几乎完全“按原样”显示内容。变量和大多数转义序列将不会被解释。例外情况是,要显示文字单引号,可以使用反斜杠对其进行转义,要显示反斜杠,可以使用另一个反斜杠对其进行转义(因此,是的,甚至单引号字符串也会被解析)。\'\\
  2. 双引号字符串将显示大量转义序列(包括一些正则表达式),并且将计算字符串中的变量。这里很重要的一点是,您可以使用大括号来隔离要计算的变量的名称。例如,假设您有变量,并且想要 .这将寻找变量 。要解决这个问题,请使用 .看看字符串解析,看看如何使用数组变量等。$typeecho "The $types are"$typesecho "The {$type}s are"
  3. Heredoc 字符串语法的工作方式类似于双引号字符串。它以 开头。在此运算符之后,将提供标识符,然后提供换行符。字符串本身紧随其后,然后再次使用相同的标识符以结束引号。在此语法中,无需转义引号。<<<
  4. Nowdoc(从 PHP 5.3.0 开始)字符串语法基本上就像单引号字符串一样。不同之处在于,甚至不必转义单引号或反斜杠。nowdoc 的标识顺序与 heredocs 的顺序相同,但后面的标识符用单引号括起来,例如 .nowdoc 中没有进行任何解析。<<<<<<'EOT'

笔记:必须对单引号内的单引号和双引号内的双引号进行转义:

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

速度:
没有区别
请阅读一位PHP核心开发人员关于此事的可靠文章。说到测试,永远不要认为它们是理所当然的。必须理解,编写可信的测试,尤其是解释其结果需要大量的知识和经验。这意味着大多数测试都是假的。例如,在这样的代码中

for($i=0;$i<100000;$i++) {
    'string';
}

带引号的字符串与整个脚本一起只被解析一次,然后被转换为操作码。然后被执行一百万次。因此,它测量除解析之外的任何内容。而这只是冰山一角。对于像这样的纳米基准测试,几乎不可能创建一个可信的测试,不会被一些干扰的副作用所破坏。

评论

33赞 devios1 7/25/2013
+1 用于卷曲大括号技巧。没有意识到这一点。太糟糕了,它不遵循与 shell 脚本相同的约定,即 .${variablename}
7赞 Jo Smo 7/4/2014
我只使用双引号,当我需要它时,我代码中的任何其他内容都用单引号引起来。\nPHP
0赞 sjsam 1/8/2015
似乎“heredoc”是从 bash 移植到 PHP 的,还是不是?无论如何,很好的答案,所以+1谢谢。
6赞 dregad 8/10/2017
PHP 文档注释中有趣的注释: php.net/manual/en/language.types.string.php#120160 - “双引号字符串”看起来很$slow,因为它们必须解析\n个反斜杠和$dollar符号的所有内容才能进行变量扩展“,结果证明是PHP中最快的字符串连接方法 - 句号!只有当你的字符串完全是文字时,单引号才会更快(其中没有任何东西可以解析,也没有任何东西可以连接),但边距非常小,无关紧要。
3赞 SherylHohman 1/20/2019
注意:双引号的缓慢几乎已成为过去。如今,除了极端情况外,更新增加了双引号的处理速度。"
75赞 Janak Kanani 4/12/2014 #6

'单引号

指定字符串的最简单方法是将其括在单引号中。单引号内的所有内容都被视为纯字符串。

例:

echo 'Start with a simple string';
echo 'Variables $var and escape sequences \n do not get interpolated';
echo 'You only need to escape the quote \' and a backslash itself\\';

"双引号

双引号中的字符串插值变量和各种转义序列。注意:使用大括号来包含复杂变量,或者如果变量后面的下一个字符是变量名称的有效字符。{}

例:

echo "Start with a simple string";
echo "String's apostrophe";
echo "Escape sequences get interpolated\n";
echo "Variables $var get interpolated as well {$name}_sake";

PHP 中的单引号与双引号是否有性能优势?

不。

为了提高性能,PHP 对整个代码进行一次解析,然后将生成的字节码存储在操作码缓存中。这种方法消除了整个解析,以及任何字符串。

评论

1赞 SherylHohman 1/20/2019
单引号不解析字符串中的任何内容的一个例外是,您可以使用它来转义单个撇号以在字符串中使用(或显示反斜杠)。请注意,传统的转义序列(例如)不会解析为换行符。关于字符串的 PHP 文档\'\\'\n
0赞 Bahman.A 12/11/2019
我在所有答案中都看到:您可以在双引号内使用变量的名称来打印出变量的值,但您是说,变量名称也应该括在大括号内,以避免需要使用连接句点。那么,如果 “$my_var” 和 “{$my_var}” 都输出 $my_var 的值,大括号有什么用呢?谢谢!
1赞 William Patton 8/11/2021
@Bahman.A 我知道已经很多年了,你可能已经知道答案了,但以防其他人将来也在寻找同样的事情:当 var 在双引号中使用时,会添加卷曲分支,主要是为了代码的可读性。在快速扫描以找到它时非常有用,它是一个 var 而不是字符串文字。
0赞 Justin 2/8/2022
@Bahman.A 我相信你之所以使用 而不是 不是可读性,而是为了精确的变量查找。 还允许数组和对象查找。用于串联字符串的点运算符对于函数查找仍然需要"{$one}""$one"{ }
0赞 alexia 10/9/2022
它还允许您编写 ,因为会被解释为 。{$foo}bar$foobar{$foobar}
4赞 Takit Isy 4/9/2018 #7

有人可能会说我有点跑题了,但无论如何,这里是:

由于字符串的内容,您不必在以下两者之间进行选择:
echo "It's \"game\" time.";echo 'It\'s "game" time.';

如果您熟悉英文引号的用法,以及撇号的正确字符,则可以使用双引号或单引号,因为这不再重要:
echo "It’s “game” time.";echo 'It’s “game” time.';

当然,如果需要,您也可以添加变量。只是不要忘记,它们只有在双引号中才会被评估!