シングルクォートとダブルクォートの違いについて
変数を展開するか
ダブルクォートは文字列に含まれる変数を解釈し、その値で変数の箇所を置き換える。
そのような処理のことを変数展開または変数のパース(Parse)と言う。
シングルクォートは変数展開せずそのまま表示される。
前回の例
<?php
$title = ‘死霊館シリーズ’;
$data1 = “怖かったホラー映画は「{$title}」です。<br>“;
$data2 = ‘怖かったホラー映画は「{$title}」です。<br>’;
print $data1;
//結果: 怖かったホラー映画は「死霊館シリーズ」です。
print $data2;
//結果: 怖かったホラー映画は「{$title}」です。
変数全体を{~}で囲んでいるのは、変数の範囲を明確にするため。
例えば次の例
“I am $modifier_man!!”
この例では展開すべき変数が $modifier なのか $modifier_man なのか不明確である。
しかし次のようにすることで分かりやすく表示できる。
“I am {$modifier}_man!!”
変数の接頭辞である「$」を前に出して次のように記述しても良い。
“I am ${modifier}_man!!”
{~}は省略できるが、誤認識によって思わぬ変数展開が行われるのを防ぐ為にもできるだけ省略しない。
ダブルクォートの中で「$」という文字列そのものを含めたい場合には「\$」のようにエスケープする。
エスケープシーケンスを認識するか
PHPではタブや改行など特殊な意味を持ちディスプレイに表示できない文字を「\文字」の形式で表現できる。
このような文字のことをエスケープシーケンスという。
PHPで利用可能な主なエスケープシーケンス
エスケープシーケンス | 概要 |
---|---|
\r | 復帰(キャリッジリターン) |
\n | 改行(ラインフィード) |
\t | 水平タブ |
\v | 垂直タブ |
\f | フォームフィード |
\$ | ドル記号 |
\|バックスラッシュ(円記号) | |
\” | ダブルクォート |
\nnn | 3桁の8進数で表された文字 |
\xnn | 2桁の16進数nnnで表された文字 |
\u{nnnn} | 4桁の16進数nnnnで表されたUnicode文字 |
これらのエスケープシーケンスを認識できるのはダブルクォート文字列だけ。
シングルクォート文字列では「\’」(シングルクォート)と「\\」(バックスラッシュ)だけが認識され、それ以外のエスケープシーケンスはそのまま表示される。
(逆にダブルクォート文字列では「\’」は認識されずそのまま「\’」として表示される)。
文字列リテラルの最後で「\」と表示させたい場合には、シングルクォートでかかる場合も「\\」のように評価する。
$str = ‘今日は朝コーヒー作れて今飲んでるけど\’;
//結果: エラー
$str = ‘昨日は飲まなかった\\’;
//結果: 昨日は飲まなかった\
単に「\」と書いた場合には「\’」がエスケープされてしまい、「終了されていない文字列」とみなされてしまうから。
以上の違いから、基本的には文字列リテラルはシングルクォートでくくるものとし、変数展開やエスケープシーケンスの利用などの意図がある場合にのみダブルクォートを利用するのが好ましい。
ヒアドキュメント
文字列リテラルをあらんすもう1つの方法として、ヒアドキュメントという仕組みがある。
ヒアドキュメントは改行を含むような長い文字列を表すのに適した記法である。
具体例
<?php
$str = ‘PHP’;
$msg = <<<EOD
私は今現在仕事をしながら休みの日に与えられたカリキュラムをこなし、エンジニアになる為に日々勉強中です。
仕事は電量販店で接客業を通してコミュニケーション能力を鍛え、休日にはHTMLや{$str}を勉強しています。
EOD;
print $msg;
//結果:
私は今現在仕事をしながら休みの日に与えられたカリキュラムをこなし、エンジニアになる為に日々勉強中です。
仕事は電量販店で接客業を通してコミュニケーション能力を鍛え、休日にはHTMLやPHPを勉強しています。
ヒアドキュメントでは「<<<EOD」から「EOD;」までを文字列リテラルとみなす。
「EOD」は文字列の開始と終了を表すためのデミリタ(区切り文字)なので、開始と終了とが対応していれば適当に変更しても構わない。
たとえば、
「<<<CONTENT~CONTENT;」
や
「<<<HOGEHOGE~HOGEHOGE;」
なども正しいヒアドキュメント。
開始/終了文字列は小文字でも良いが、文字列リテラルそのものと識別しやすいように、全て大文字で表すのが一般的。
開始文字列によって、文字列の解釈が変化する点にも要注意
ヒアドキュメントで使える開始文字列
開始文字列 | 意味 |
---|---|
<<<EOD | 文字列に含まれるエスケープシーケンスを展開 |
<<<“EOD” | 文字列に含まれるエスケープシーケンスを展開(上と同じ) |
<<<‘EOD’ | 文字列に含まれるエスケープシーケンスを展開しない |
いわゆるダブルクォート文字列とシングルクォート文字列の違い。
先ほどの例を「<<<‘EOD’~EOD」に置き換えると
<?php
$str = ‘PHP’;
$msg = <<<‘EOD’
私は今現在仕事をしながら休みの日に与えられたカリキュラムをこなし、エンジニアになる為に日々勉強中です。
仕事は電量販店で接客業を通してコミュニケーション能力を鍛え、休日にはHTMLや{$str}を勉強しています。
EOD;
print $msg;
//結果:
私は今現在仕事をしながら休みの日に与えられたカリキュラムをこなし、エンジニアになる為に日々勉強中です。
仕事は電量販店で接客業を通してコミュニケーション能力を鍛え、休日にはHTMLや{$str}を勉強しています。
変数$strが展開されずにそのまま表示されていることが確認できる。
ダブルクォート文字列、シングルクォート文字列と異なる点は、いずれの構文を利用した場合にも、ヒアドキュメントでは自由に(エスケープ処理することなく)クォート文字を含める事ができると言う点。
(正確には「<<<‘EOD’~EOD;」の構文はヒアドキュメントとは区別してNowDoc構文と呼ばれる。)
次回 インデントの除法