PHPでの単一引用符付き文字列と二重引用符付き文字列の違いは何ですか?


796

文字列が一重引用符で囲まれ、場合によっては二重引用符で囲まれたPHPのコードが表示されるのは、少し混乱しています。

.NETまたはC言語で、単一引用符で囲まれている場合、それは文字列ではなく文字であることを知っています。

回答:


1086

PHP文字列は、 2つの方法だけでなく、 4 つの方法で指定できます。

  1. 一重引用符で囲まれた文字列は、ほぼ完全に「そのまま」表示されます。変数とほとんどのエスケープシーケンスは解釈されません。例外は、リテラルの単一引用符\'を表示する場合はバックスラッシュでエスケープでき、円記号を表示する場合は別のバックスラッシュでエスケープできます\\そのため、単一引用符で囲まれた文字列でも解析されます)。
  2. 二重引用符の文字列は、エスケープされた文字(一部の正規表現を含む)のホストを表示し、文字列内の変数が評価されます。ここで重要な点は、中括弧を使用して、評価する変数の名前を分離できることです。たとえば、変数が$typeあり、それをしたいとしますecho "The $types are"。それは変数を探します$types。この使用を回避echo "The {$type}s are"するには、左中括弧をドル記号の前または後に置くことができます。見てみましょう解析する文字列を配列変数と、そのような使用方法を参照してください。
  3. ヒアドキュメントの文字列構文は、二重引用符で囲まれた文字列のように機能します。で始まり<<<ます。この演算子の後、識別子が提供され、次に改行が提供されます。文字列自体が続き、次に同じ識別子が再び引用を閉じます。この構文では引用符をエスケープする必要はありません。
  4. Nowdoc(PHP 5.3.0以降)の文字列構文は、基本的に単一引用符で囲まれた文字列のように機能します。違いは、単一引用符やバックスラッシュでさえエスケープする必要がないことです。nowdocは<<<、ヒアドキュメントと同じシーケンスで識別されますが、その後に続く識別子は単一引用符で囲まれます<<<'EOT'nowdocでは解析は行われません。

注: 一重引用符内の単一引用符と二重引用符内の二重引用符はエスケープする必要があります。

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

速度:
一重引用符の方が二重引用符よりも高速であることを重視しません。特定の状況では、おそらくより高速です。PHP 4.3以降Useless Optimizationsセクションの一番下)、一重引用符と二重引用符が基本的に等しく高速である1つの方法を説明する記事次に示しCます。また、このベンチマークページには、一重引用符と二重引用符の比較があります。ほとんどの比較は同じです。二重引用符が単一引用符よりも遅い比較が1つあります。


17
中かっこトリックの+1。それを知らなかった。残念ながら、シェルスクリプトと同じ規則に従っていません${variablename}
devios1 2013

6
私は二重引用符のみを使用\nしていPHPます。それが必要な場合は、コード内の他のすべてが単一引用符で囲まれています。
Jo Smo 14

'heredoc'はbashからPHPに移植されているようですが、そうではありませんか?とにかく素晴らしい答えなので、+ 1ありがとうございます。
sjsam 2015年

2
PHPドキュメントのコメントで興味深いメモ:php.net/manual/en/language.types.string.php#120160-「二重引用符で囲まれた文字列」は、\ nバックスラッシュと$ dollarのすべてを解析する必要があるため、$ slowのように見えます変数展開を行うための記号」、PHPでの最速の文字列連結メソッドであることが判明-期間!文字列が完全にリテラルである場合(解析するものも連結するものもない)、シングルクォートの方が高速ですが、マージンは非常に小さく、重要ではありません。」
dregad 2017

1
注:"二重引用符の処理速度の低下は、過去のものです。更新により、最近の極端な場合を除いて、二重引用符の処理が速くなります。
SherylHohman

211

物事は二重引用符で評価されますが、単一引用符では評価されません。

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

43
PHPを初めて使用する多くの開発者が犯している間違い $mailbody = 'I want a line break:\nDone.';は、\n生き続けることです。一方$mailbody = "I want a line break:\nDone.";、改行を解析します。
Kai Noack

私の2セントは、インタビューやマルウェアの開発にのみ必要です。2つの式の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、実際の文字を含む文字列に変換されました。
Rostyslav Pylypenko

56

' 一重引用符

文字列を指定する最も簡単な方法は、文字列を一重引用符で囲むことです。一重引用符は一般的に高速で、内部で引用されたものはすべてプレーン文字列として扱われます。

例:

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は文字列内に変数があるかどうかをチェックするために解析する必要があります。


文字列内で何も解析しない一重引用符の1つの例外は、文字列内で使用\'するために単一のアポストロフィをエスケープする(または\\'バックスラッシュを表示する)ために使用できるものです。などの従来のエスケープシーケンスは\n、改行文字に解析されないことに注意してください。文字列に関するPHPドキュメント
SherylHohman

私はすべての答えを見ます:変数の名前を二重引用符の内側で使用して変数の値を出力できますが、変数名も中括弧で囲む必要があるため、連結を使用する必要がありません。限目。「$ my_var」と「{$ my_var}」の両方が$ my_varの値を出力する場合、中括弧は何ですか?ありがとう!
Bahman.A

40

一重引用符で囲まれた文字列には、解釈される変数がありません。二重引用符で囲まれた文字列にはあります。

また、二重引用符で囲まれた文字列にはバックスラッシュなしのアポストロフィを含めることができますが、単一引用符で囲まれた文字列にはエスケープしない引用符を含めることができます。

単一引用符で囲まれた文字列は、解析する必要がないため、実行時に高速になります。


8
一重引用符で囲まれた文字列は、より少ないメモリを使用します。PHPで文字列を処理する最も速い方法は、単一引用符を使用してを使用することです。文字列と変数を連結する演算子。
RibaldEddie 2010

うーん、私が間違っていても私を訂正しますが、PHPのベース言語はCですよね?では、なぜPHPとCでは文字列の引用符が異なるのでしょうか。
rob waminal 2010

1
@rob waminal:PHPはCで実装できますが、別の言語です。PHP言語はこれらのセマンティクスを指定します。
ボレアリド

@Ribald-nowdoc構文の方が高速ではないでしょうか?単一引用符で囲まれた文字列は、エスケープされた単一引用符とバックスラッシュについて解析されます。
Peter Ajtai 2010

@ピーター、あなたは正しいかもしれません、私は本当にそれを掘り下げる気にしたことがありません。PHPのドキュメントはスピードを主張しています。私は信仰についてのドキュメントを信じることにしました。:)
RibaldEddie 2010

27

PHPでは、'my name'および"my name"は両方とも文字列です。詳細については、PHPのマニュアルを参照してください

あなたが知っておくべきことは

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

これは、他の文字列の使用にも当てはまります。


18

一重引用符、二重引用符、ヒアドキュメント、およびノウドクの引用の例

<?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;

?>

16

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

ここでは、二重引用符が値を解析し、単一引用符は文字列値と見なされます($test変数を解析しません)。


12

どちらの種類の囲まれた文字も文字列です。1つのタイプの引用は、他のタイプの引用を囲むのに便利に使用されます。 "'"'"'。引用符のタイプ間の最大の違いは、囲まれた識別子参照が二重引用符の内側ではなく、単一引用符の内側で置き換えられることです。


3

PHPでの単一引用符と二重引用符の使用の違いは、echoステートメントで単一引用符を使用すると、文字列として扱われることです。...しかし、変数名を二重引用符で囲んで入力すると、その変数の値が文字列とともに出力されます。


0

ここでは、変数を使用した一重引用符と二重引用符のいくつかの可能性

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';

-1

ひとこと:

ヒアドキュメントの終了識別子を持つ行には、セミコロン(;)以外の文字を含めてはならないことに注意してください。つまり、識別子がインデントされていない可能性があり、セミコロンの前後にスペースタブが含まれていない可能性があります。

例:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

1
これは正しい説明ですが、ここでの質問とは関係ありません。
miken32

-1

多分私は少し遅れて、少し話題外ですが、とにかくここにあります:

文字列の内容が以下の理由により、必ずしも選択する必要はありません。
alert("It's \"game\" time.");またはalert('It\'s "game" time.');

あなたは英語の引用符の使用、およびアポストロフィの正しい文字に精通している場合、あなたはどちらか、二重引用符または一重引用符を使用し、それがないので問題はもうすることができます
alert("It’s “game” time.");し、alert('It’s “game” time.');

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.