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

rob*_*nal 762 php string syntax

我不是PHP编程方面的专家,但我有点困惑为什么我在PHP中看到一些代码用单引号放入字符串的代码,有时用双引号.

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

Pet*_*tai 1039

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中没有解析.

速度:
我不会过分夸大单引号比双引号更快.在某些情况下,它们可能更快.这篇文章解释了自PHP 4.3以来单引号和双引号基本上同样快的一种方式(Useless Optimizations向下,部分C).此外,该基准测试页面还有单引号和双引号比较.大多数比较是相同的.有一个比较,其中双引号比单引号慢.

  • +1大括号技巧.没有意识到这一点.太糟糕了,它不遵循与shell脚本相同的约定,即`$ {variablename}`. (15认同)
  • 我只使用双引号,当我需要它为`\n`时,我的`PHP`代码中的任何其他内容都是单引号. (4认同)
  • 要记住:"数据库"中的"单词"为"字符串"和"双重". (3认同)
  • PHP文档注释中有趣的注释:http://php.net/manual/zh/language.types.string.php#120160-“双引号字符串”看起来很慢,因为它们必须为\ n解析所有内容反斜杠和$ dollar符号来进行变量扩展”,原来是PHP中最快速的字符串连接方法-PERIOD!单引号只有在您的字符串是完全文字的情况下才更快(其中没有要解析的内容,也没有要连接的内容),但是利润很小,没关系。” (2认同)
  • 注意:`"` 双引号的缓慢几乎已经成为过去。如今,更新增加了双引号的处理速度,在极端情况下,除极端情况外。 (2认同)

Dan*_*ani 198

事情用双引号评估,但不是单一:

$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.
Run Code Online (Sandbox Code Playgroud)

  • 很多开发人员都不熟悉PHP的错误:`$ mailbody ='我想要一个换行符:\nDone.';`让`\n`保持活着.然而:`$ mailbody ="我想换行:\n完成.";`将解析换行符. (37认同)
  • 我的两分钱仅用于采访或恶意软件开发。只需比较两个表达式中的 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` 中的字符序列已转换为带有 real 的字符串字母。 (2认同)

小智 48

' 单引号

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

例:

echo 'Start with a simple string';
echo 'String\'s apostrophe';
echo 'String with a php variable'.$name;
Run Code Online (Sandbox Code Playgroud)

" 双引号

在PHP中使用双引号以避免必须使用句点来分隔代码(注意:{}如果您不想.在字符串中使用concatenation()运算符,请使用花括号来包含变量).

例:

echo "Start with a simple string";
echo "String's apostrophe";
echo "String with a php variable {$name}";
Run Code Online (Sandbox Code Playgroud)

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

是.使用单引号稍微快一些.

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


Bor*_*lid 36

单引号字符串中没有解释变量.双引号字符串.

此外,双引号字符串可以包含没有反斜杠的撇号,而单引号字符串可以包含未转义的引号.

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

  • 单引号字符串也使用较少的内存.在PHP中处理字符串的最快方法是使用单引号并使用.运算符以连接字符串和变量. (8认同)
  • @rob waminal:PHP 可以用 C 实现,但它是一种不同的语言。PHP 语言指定了这些语义。 (2认同)

Ban*_*Dao 24

在PHP中,这两个'my name'"my name"的字符串.您可以在PHP手册中阅读更多相关信息.

你应该知道的是

$a = 'name';
$b = "my $a"; == 'my name'
$c = 'my $a'; != 'my name'
Run Code Online (Sandbox Code Playgroud)

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

还有一点是,

echo 'my name';
Run Code Online (Sandbox Code Playgroud)

比...更快

echo "my name";
Run Code Online (Sandbox Code Playgroud)

echo 'my ' . $a;
Run Code Online (Sandbox Code Playgroud)

比...慢

echo "my $a";
Run Code Online (Sandbox Code Playgroud)

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


小智 16

single,double,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;

?>
Run Code Online (Sandbox Code Playgroud)


小智 13

在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
Run Code Online (Sandbox Code Playgroud)

这里,双引号解析值,单引号被视为字符串值(不解析$ test变量.)


wal*_*lyk 11

两种封闭的字符都是字符串.一种报价方便地用于包含其他类型的报价. "'"'"'.引号类型之间的最大区别是封闭的标识符引用替换为内部双引号,但不在单引号内.