【问题标题】:What is the difference between single-quoted and double-quoted strings in PHP?PHP 中的单引号和双引号字符串有什么区别?
【发布时间】:2023-01-11 05:42:21
【问题描述】:

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

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

【问题讨论】:

    标签: php string syntax


    【解决方案1】:

    PHP strings 不仅可以在方式,但在方法。

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

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

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

      速度:
      我不会过分强调单引号比双引号更快。在某些情况下,它们可能更快。这是一篇文章 explaining one manner in which single and double quotes are essentially equally fast since PHP 4.3Useless Optimizations 到底部,部分 C)。此外,benchmarks page 具有单引号与双引号比较。大多数比较都是相同的。有一个比较,双引号比单引号慢。

    【讨论】:

    • +1 花括号技巧。没有意识到这一点。太糟糕了,它不遵循与 shell 脚本相同的约定,即 ${variablename}
    • 我只使用双引号,当我需要它用于 时,我的 PHP 代码中的任何其他内容都用单引号引起来。
    • 似乎“heredoc”是从 bash 移植到 PHP 的,或者不是吗?无论如何很好的答案,所以+1谢谢。
    • PHP 文档 cmets 中有趣的注释:php.net/manual/en/language.types.string.php#120160 - “双引号字符串”看起来太慢了,因为它们必须解析所有内容 反斜杠和 $ 美元符号来进行变量扩展”,结果证明这是 PHP 中最快的字符串连接方法 - PERIOD!只有当您的字符串完全是文字时(没有要解析的内容,也没有要连接的内容),单引号才会更快,但利润率非常小,无关紧要。”
    • 注意:"双引号的缓慢已经成为过去。这些天,在除极端情况外的所有情况下,更新增加了双引号的处理速度。
    【解决方案2】:

    事情用双引号而不是单引号评估:

    $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.
    

    【讨论】:

    • 即使在单引号字符串中,转义单引号和转义反斜杠也会被扩展。
    • 许多刚接触 PHP 的开发人员都犯了一个错误:$mailbody = 'I want a line break: Done.'; 使 保持活动状态。而:$mailbody = "I want a line break: Done."; 将解析换行符。
    • 我的两分钱只用于采访或恶意软件开发。只需比较两个表达式中的 var_dump():$testWithAsciiAndUtf8Characters = "HALLO u{0147}u{012B}u{0144}u{014D}!";$simpleTest = 'HALLO u{0147}u{012B}u{0144}u{014D}!';$testWithAsciiAndUtf8Characters中的字符序列被转换为具有真实字母的字符串。
    【解决方案3】:

    '单引号

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

    例子:

    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 必须解析以检查字符串中是否有任何变量。

    【讨论】:

    • 单引号的异常不解析字符串中的任何内容,您可以使用 ' 转义单个撇号以在字符串中使用(或 \' 显示反斜杠)。请注意,传统的转义序列(例如 )不会被解析为换行符。 PHP docs on strings
    • 我在所有答案中看到:您可以在双引号内使用变量名称来打印出变量的值,但您是说,变量名称也应包含在大括号内以避免需要使用串联时期。那么如果“$my_var”和“{$my_var}”都输出$my_var 的值,那么大括号是干什么用的呢?谢谢!
    • @Bahman.A 我知道已经有好几年了,此时你可能已经知道答案了,但以防其他人在未来寻找同样的东西:当 vars 在双引号中使用时,添加卷曲分支主要是为了代码的可读性。在快速扫描到 grok 时非常有用,它是一个 var 而不是字符串文字。
    • @Bahman.A 我相信您使用 "{$one}" 而不是 "$one" 的原因不是可读性而是精确变量查找。 { } 还允许数组和对象查找。用于字符串连接的点运算符仍然需要用于函数查找
    • 它还允许您编写 {$foo}bar,因为 $foobar 会被解释为 {$foobar}
    【解决方案4】:

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

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

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

    【讨论】:

    • 单引号字符串也使用更少的内存。在 PHP 中处理字符串的最快方法是使用单引号并使用 .运算符连接字符串和变量。
    • 嗯,如果我错了请纠正我,但是 PHP 的基本语言是 C 对吗?那么为什么字符串引号在 PHP 和 C 中不同?
    • @rob waminal:PHP 可以用 C 实现,但它是一种不同的语言。 PHP 语言指定了这些语义。
    • @Ribald - nowdoc 语法不会更快吗?单引号字符串被解析为转义的单引号和反斜杠。
    • @Peter,你可能是对的,我从来没有费心去真正深入研究它。 PHP 文档声称速度,我决定相信这些文档。 :)
    【解决方案5】:

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

    你应该知道的是

    $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";
    

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        由于字符串的内容,您不一定必须选择:
        echo "It's "game" time.";echo 'It's "game" time.';

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

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

        【讨论】:

          猜你喜欢
          • 2011-03-27
          相关资源
          最近更新 更多