PHPでは文字列リテラル (※1) を扱う場合、
シングルクォーテーション (引用符 ‘ ) か
ダブルクォーテーション (二重引用符 " ) かで
囲むのが一般的 (※2) です。
※1 : リテラルとはプログラムソースコード内に値を直接表記したもののことです
※2 : 「一般的」と言ったのは、他にもヒアドキュメントとか Nowdoc とかいった
扱い方もあるからです (これらを使用する必要性や頻度はかなり少ないはず)
興味のある方は PHP Manual : 文字列 を参照してください
では、この2つはどう違うのでしょう?
PHP Manual では、
「変数と特殊文字のエスケープシーケンスは、 引用符 (シングルクオート) で
括られた文字列にある場合には展開されません。」
「文字列が二重引用符 (“) で括られた場合、 PHP は、より多くの特殊文字の
エスケープシーケンスを理解します。」
とあります。具体例を示して解説してみます。
一番大きな違いは、シングルクォーテーションもしくは
ダブルクォーテーションで囲まれた文字列の中に記載されている
PHP の変数を自動的に展開してくれるかどうかです。
以下に例を挙げてみます。
<?php $str = 'ありがと'; echo '[1] $str です<br />'; echo "[2] $str です<br />"; echo "[3] {$str}です<br />"; ?>
出力結果は、以下のような感じになります。
[2] ありがと です
[3] ありがとです
[1] と [2] の出力結果を比較してみてください。
シングルクォーテーションで囲んだ文字列を出力した場合には、
変数を表す 「$str」 がそのままの文字として出力されています。
一方、ダブルクォーテーションで囲まれた文字列を出力した場合には、
変数を表す 「$str」 は、その代入された内容が出力されています。
変数が展開されているのが分かります。
ただし、ダブルクォーテーションで囲んだ文字列の中に
展開させたい変数を入れる場合、後に続く文字列があると、
変数の後ろに半角スペースを入れておかないと変数名が誤認識され、
「Notice: Undefined variable」 と警告が出ます。
ただ、こうすると、当然半角スペースまで出力されてしまいますので、
半角スペースを出力させたくない場合には、[3] のように、
変数を { } で囲んで 「ここからここまでが変数ですよ」と
PHP に教えてやればオッケーです。
次の違いは、特殊文字を展開してくれるかどうかです。
<?php echo '[1] 「\tありがとです」<br />'; echo "[2] 「\tありがとです」<br />"; ?>
出力結果は、以下のような感じになります。
[2] 「 ありがとです」
PHP では、「\t」 は水平タブを表現する特殊文字です。
シングルクォーテーションで囲んだ文字列を出力した場合には、
特殊文字を表す 「\t」 がそのままの文字として出力されています。
一方、ダブルクォーテーションで囲まれた文字列を出力した場合には、
特殊文字を表す 「\t」 は、その内容であるタブが出力されるのです。
特殊文字が展開されているのですね。
ダブルクォーテーションで囲まれた場合に自動展開される特殊文字には
\n : ラインフィード (LF)
\r : キャリッジリターン (CR)
\t : 水平タブ (HT)
\\ : バックスラッシュ
\$ : ドル記号
のようなものがあります。
詳しくは PHP Manual : 文字列 #二重引用符 を参照してください。
また、シングルクォーテーションでもダブルクォーテーションでも、
それら自身の文字を文字列中に含めたい場合、
バックスラッシュ (\) でエスケープする必要があります。
シングルクォーテーションで文字列を囲む場合、PHP 内部で
変数や特殊文字を展開する必要がないので、当然のことながら
ダブルクォーテーションで囲む場合よりも速度は速いと言われています。
(文字列結合を繰り返すような場合はダブルクォーテーションで囲む方が早い場合もあるようです)
ただ、(通常では必要ないような) 大量の文字列処理でもしない限り、
はっきり言って (体感的には感じることができないというよりももっと) 微々たる差です。
結果、「どちらを使ったらいいの?」というふうに感じたら、
<?php $str = 'ありがと'; echo '[1] ' . $str . 'です<br />' . "\n"; echo "[2] {$str}です<br />\n"; echo "[3] " . $str . "です<br />" . "\n"; ?>
[1]. 変数 / 特殊文字展開させる必要のない文字はシングルクォーテーションで囲み、
展開する必要がある場合だけダブルクォーテーションで囲んだり文字列結合をする
[2]. 全てダブルクォーテーションで囲むように統一する
[3]. リテラルの中に変数を埋め込むと見辛くてイヤなので、変数や特殊文字は
常に文字列結合をする
とかいうようにどれか自分なりの(コーディング)ルールを定め、
それで統一すればよいのではないかと思います。
・・・結局は「好みの問題でイイんじゃない?」ってことですな。