PHPで文字列を出力したり、文字列を代入したりする際に、シングルクォーテーションやダブルコォーテーションを使用します。
PHPでこのように文字列を出力したり、代入したりする方法に以下の方法があります。
- シングルクォーテーションを使用する
- ダブルクォーテーションを使用する
- ヒアドキュメントを使用する
- Nowdocを使用する(5.3.0以降)
今回の記事では、文字列を使用する際のそれぞれの違いについて紹介します。
Contents
シングルクォーテーションを使用し、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を見てみるとそんなに大きな速度の違いはないのかもしれません。
可読性とかを考えて使い分けをすると良いのかもしれません。