記事一覧

シングルクォーテーションとダブルクォーテーションの違い

 posted by suzu
PHPの基礎知識

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

出力結果は、以下のような感じになります。

[1] $str です
[2] ありがと です
[3] ありがとです

[1] と [2] の出力結果を比較してみてください。
シングルクォーテーションで囲んだ文字列を出力した場合には、
変数を表す 「$str」 がそのままの文字として出力されています。
一方、ダブルクォーテーションで囲まれた文字列を出力した場合には、
変数を表す 「$str」 は、その代入された内容が出力されています。
変数が展開されているのが分かります。
ただし、ダブルクォーテーションで囲んだ文字列の中に
展開させたい変数を入れる場合、後に続く文字列があると、
変数の後ろに半角スペースを入れておかないと変数名が誤認識され、
「Notice: Undefined variable」 と警告が出ます。
ただ、こうすると、当然半角スペースまで出力されてしまいますので、
半角スペースを出力させたくない場合には、[3] のように、
変数を { } で囲んで 「ここからここまでが変数ですよ」と
PHP に教えてやればオッケーです。
 

次の違いは、特殊文字を展開してくれるかどうかです。

<?php
echo '[1] 「\tありがとです」<br />';
echo "[2] 「\tありがとです」<br />";
?>

出力結果は、以下のような感じになります。

[1] 「\tありがとです」
[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]. リテラルの中に変数を埋め込むと見辛くてイヤなので、変数や特殊文字は
   常に文字列結合をする
とかいうようにどれか自分なりの(コーディング)ルールを定め、
それで統一すればよいのではないかと思います。
・・・結局は「好みの問題でイイんじゃない?」ってことですな。

関連記事

eyecatch_php

制御構造:if

WordPressのプログラム開発言語はPHPです。 特定の条件に当てはまる場合...

記事を読む

eyecatch_php

echo と print の違い

PHPでは (フォーマットの必要がないシンプルな) 文字列を出力 (表示) する...

記事を読む

カレンダー

2019年12月
« 7月    
1234567
891011121314
15161718192021
22232425262728
293031  
PAGE TOP ↑