【问题标题】:What is the difference between single-quoted and double-quoted strings in PHP?PHP中单引号和双引号字符串有什么区别?
【发布时间】:2011-03-27 15:35:09
【问题描述】:

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

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

【问题讨论】:

    标签: php string syntax


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      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}
      • 我只使用双引号,当我需要 \n 时,我的 PHP 代码中的其他任何内容都用单引号。
      • 似乎 'heredoc' 是从 bash 移植到 PHP 还是不是?无论如何,答案很好,所以 +1 谢谢。
      • PHP 文档 cmets 中的有趣注释:php.net/manual/en/language.types.string.php#120160 -“双引号字符串”看起来很慢,因为它们必须解析所有内容以查找 \n 反斜杠和 $dollar 符号以进行变量扩展” , 原来是 PHP 中最快的字符串连接方法 - PERIOD! 单引号只有在你的字符串是完全文字的情况下才会更快(没有任何东西可以解析,也没有什么东西可以连接),但边距非常小而且不会问题。”
      • 注意:" 双引号的缓慢性已成为过去。如今,更新增加了双引号的处理速度,几乎在所有极端情况下都是如此。
      【解决方案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 必须解析以检查字符串中是否有任何变量。

      【讨论】:

      • 单引号的 one 例外不解析字符串中的任何内容,您可以使用 \' 转义单个撇号以在字符串中使用(或 @987654329 @ 显示反斜杠)。请注意,传统的转义序列,例如 \n 不会被解析为换行符。 PHP docs on strings
      • 我在所有答案中都看到:您可以在双引号内使用变量名来打印出变量的值,但您是说,变量名也应该用大括号括起来以避免需要使用连接句点。那么如果 "$my_var" 和 "{$my_var}" 都输出 $my_var 的值,那么大括号是干什么用的呢?谢谢!
      • @Bahman.AI 知道已经有好几年了,你可能已经知道了答案,但如果其他人在未来寻找同样的事情:当 vars 用于 double 时,会添加卷曲分支引号主要是为了代码的可读性。在快速扫描以理解它是 var 而不是字符串文字时非常有用。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        $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:\nDone.'; 使 \n 保持活跃。而:$mailbody = "I want a line break:\nDone."; 将解析换行符。
        • 我的两分钱只用于面试或恶意软件开发。只需比较两个表达式中的 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 中的字符序列被转换为带有真实字母的字符串。
        • 很好的例子@Dani,简短而简单,正是我所需要的。谢谢
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

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