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

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

我不是PHP编程专家,但我有点困惑为什么在PHP中看到一些字符串放在单引号中,有时放在双引号中。

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


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

  • 单引号字符串将显示几乎完全"原样"的内容。变量和大多数转义序列将不会被解释。例外情况是,要显示一个单引号,可以用反斜杠\'转义它,而要显示反斜杠,可以用另一个反斜杠\\转义它(所以是的,即使是单引号字符串也会被解析)。
  • 双引号字符串将显示一系列转义字符(包括一些regex),并计算字符串中的变量。这里重要的一点是,可以使用大括号来隔离要计算的变量的名称。例如,假设你有一个变量$type,你有一个变量echo"The $types are",它将查找变量$types。为了解决这个问题,你可以在美元符号之前或之后加上左大括号。看看字符串解析,看看如何使用数组变量等。
  • HereDoc字符串语法的工作方式类似于双引号字符串。从<<<开始。在此运算符之后,提供标识符,然后是换行符。随后是字符串本身,然后是相同的标识符以结束引号。在这种语法中不需要转义引号。
  • nowdoc(从php 5.3.0开始)字符串语法的工作原理与单引号字符串类似。区别在于,即使是单引号或反斜杠也不必转义。nowdoc用与heredocs相同的<<<序列标识,但后面的标识符用单引号括起来,例如<<<'EOT'。nowdoc中没有解析。
  • 速度:我不会太重视单引号比双引号快。在某些情况下,它们可能更快。这里有一篇文章解释了一种方式,即单引号和双引号从php 4.3(Useless Optimizations向底部,C部分)开始基本上是一样快的。另外,这个基准页面有单引号和双引号的比较。大多数比较是相同的。有一种比较,双引号比单引号慢。


    事物以双引号进行评估,但不以单引号进行评估:

    1
    2
    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
    2
    3
    echo 'Start with a simple string';
    echo 'String\'s apostrophe';
    echo 'String with a php variable'.$name;

    "双引号

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

    例子:

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

    在PHP中,单引号和双引号是否有性能优势?

    对。使用单引号稍微快一点。

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


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

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

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


    在PHP中,'my name'"my name"都是字符串。您可以在PHP手册中了解更多关于它的信息。

    你应该知道的是

    1
    2
    3
    $a = 'name';
    $b ="my $a"; == 'my name'
    $c = 'my $a'; != 'my name'

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

    另一件事是,

    1
    echo 'my name';

    比快

    1
    echo"my name";

    但是

    1
    echo 'my ' . $a;

    比慢

    1
    echo"my $a";

    对于其他使用的字符串来说,这是正确的。


    单引号、双引号、HereDoc引号和Nowdoc引号示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?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;

    ?>


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

    1
    2
    3
    $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变量)。


    这两种带圈字符都是字符串。一种类型的报价单方便地用于括住另一种类型的报价单。"'"'"'。引号类型之间的最大区别在于,用带括号的标识符引用替换双引号内的引用,而不是单引号内的引用。


    也许我有点晚了,有点离题了,但不管怎么说,这就是…

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

    相反,您可以这样键入,然后使用双引号或单引号,因为这并不重要:alert("It’s"game" time.");alert('It’s"game" time.');


    一件事:

    需要注意的是,带有hereDoc结束标识符的行不能包含任何其他字符,分号(;)除外。这意味着标识符不能缩进,分号前后也不能有任何空格或制表符。

    例子:

    1
    2
    3
    4
    5
       $str = <<<EOD
    Example of string
    spanning multiple lines
    using heredoc syntax.
    EOD
    ;