PHPで文字列を扱う時のシングルクォートとダブルクォート等の使い方と違い

シェアする

PHPで文字列を出力したり、文字列を代入したりする際に、シングルクォーテーションやダブルコォーテーションを使用します。

PHPでこのように文字列を出力したり、代入したりする方法に以下の方法があります。

  • シングルクォーテーションを使用する
  • ダブルクォーテーションを使用する
  • ヒアドキュメントを使用する
  • Nowdocを使用する(5.3.0以降)

今回の記事では、文字列を使用する際のそれぞれの違いについて紹介します。

シングルクォーテーションを使用し、PHPで文字列を扱う

シングルクォーテーションで囲まれた文字列は、ほとんどの場合文字列をそのまま表示します。変数とほとんどのエスケープシーケンスは解釈されません。例外として、リテラルのシングルクォーテーションを表示するには、バックスラッシュ(\’)でエスケープし、バックスラッシュを表示するには別のバックスラッシュ\\でエスケープすることができます。

下記にPHPで記載した例を示します。

$str = 'hoge';

//「This is a $str.」 と表示される
echo 'This is a $str.';

//「This is a {$str}.」 と表示される
echo 'This is a {$str}.';

//「12345\n67890」 と表示される
echo '12345\n67890'; 

//「'\」と表示される
echo '\'\\';

上記のように、シングルクォーテーションで囲んだ文字列に変数を入れても変数が展開されず、文字列として扱われます。
また、シングルクォーテーションでエスケープしたシングルクォーテションとバックスラッシュは、表示できますが、それ以外のエスケープシーケンスは解釈されません。また。波括弧 ({})で囲んだ変数も変数としてでなく、文字列として解釈されます。

ダブルクォーテーションを使用し、PHPで文字列を扱う

ダブルクォーテーションで、エスケープ文字(いくつかの正規表現を含む)の多数を表示することが出来、文字列内の変数が評価されます。ここで重要な点は、中括弧を使用して評価する変数の名前を分離できることです。たとえば、変数$typeを”The $types are”と表記するとします。こうすると、変数$typesを評価しようとしますが、これを回避するに「echo “The {$type}s are”;」と波括弧を使用することで表現することが出来ます。

下記にPHPでの例を示します。

$str = 'hoge';

//「This is a hoge.」 と表示される
echo "This is a $str.";

//「This is a hoges.」 とsがhogeの後に連結され表示される
echo "This is a {$str}s.";

//「12345
//67890」 と改行され表示される
echo "12345\n67890"; 

//「\'\」と表示される
echo "\'\\";

ダブルクォーテーションを使用し文字列を使用する場合は、上記のように変数は評価され、変数内の値が展開されます。これは波括弧を使用した場合も同じです。
また改行コードの\nも改行として処理されます。もし文字列の\nを表示したい場合は、\\nでエスケープするとバックスラッシュとして展開されます。

ヒアドキュメントを使用するし、PHPで文字列を使用する

ヒアドキュメントは、ダブルクォーテーションで囲まれた文字列のように機能します。 <<<で始まります。この演算子の後には、特定の識別子が与えられ、次に改行が与えられます。文字列自体が後に続き、同じ識別子が再び引用符を閉じます。この構文で引用符をエスケープする必要はありません。

下記にヒアドキュメントを使用した際に例を示します。

$str = 'hoge';

$heredocs = <<< EOM
This is a $str.
This is a {$str}s.
12345\n67890
\'\\
EOM;

echo $heredocs;

/*出力結果
This is a hoge.
This is a hoges.
12345
67890
\'\
*/

出力の結果は、ダブルクォーテーションで囲った時と同じようになります。

Nowdocを使用する(5.3.0以降)でPHPで文字列を扱う

Nowdoc(PHP 5.3.0以降)は基本的にシングルクォートでの文字列のように機能します。違いは、シングルクォーテーションやバックスラッシュをエスケープする必要がないことです。 Nowdocは、heredocsに使用されるのと同じ<<<シーケンスで識別されますが、はじめの識別子は単一引用符で囲まれます。 <<< ‘EOT’。

下記にプログラムの例を示します。

$str = 'hoge';

$heredocs = <<< 'EOM'
This is a $str.
This is a {$str}s.
12345\n67890
\'\\
EOM;

echo $heredocs;

/*出力結果
This is a $str.
This is a {$str}s.
12345\n67890
\'\\
*/

出力結果が、シングルクォーテーションの時と同じということがわかると思います。

PHPでシングルクォーテーションかダブルクォーテーションで囲った場合の速度の比較

シングルクォーテーションを囲ったり、ダブルクォーテーションを使用して文字列を囲ったりする際に、どちらの方が速度が早いのか気になるなるかもしれません。

The PHP Benchmarkのdouble (“) vs. single (‘) quotesを見てみるとそんなに大きな速度の違いはないのかもしれません。

可読性とかを考えて使い分けをすると良いのかもしれません。