« 2009年05月 | メイン | 2009年07月 »

2009年06月11日

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

ひさしぶりの技術ネタ。とは言え、かなり初心者向けネタ。某起業家向けMLへは転送しません。

他の言語のことはひとまず置いておいて、PHPにはシングルクォテーション(以下、「'」と記す)とダブルクォテーション(以下、「"」と記す)に対する考えがあります。

JavaScript も一緒か。。。まぁ、他の言語のことはひとまず置いておいて。

「'」も「"」も文字列をくくるのに使われますが、それぞれの使われ方がちょっと違うのです。

違いを一言で言うと

シングルクォテーション「'」は中身をそのまま出力します。
ダブルクォテーション「"」は中身を解析します。

例えば

下記のような文字列の値を持つ変数があるとします。(変数って何?と言う説明は割愛します)

$str = "月曜日";

これを

echo '今日は $str です。';
echo "今日は $str です。";

とすると、前者は

今日は $str です。

と出力するのに対し、後者は

今日は 月曜日 です。

と出力します。違いがわかりますでしょうか?

シングルクォテーション「'」は中身をそのまま出力します。
ダブルクォテーション「"」は中身を解析します。

わかったかな?

解析するのでその分若干ながらも処理に時間がかかります。人が直感的に気付くほどでは無いとはいえ、チリも積もれば、と言う考えから私は必要で無いところは極力「'」を使用します。

ところが処理に必要が無くても「"」を使わなければいけない時があります。

echo 'It's Monday.';
echo "It's Monday.";

この場合、後者を使わなければなりません。何故なら前者では

echo 'It'

で文字列が完結してしまい、

s Monday.'

はプログラムが解析できないのでエラーになってしまうからです。

そこが「'」の致命的な弱点です。

「"」にはその致命的な弱点がありません。

何故なら

echo "He said "Hello" to you.";

は確かに

echo "He said "

で文字列が完結してしまい、

Hello" to you."

はプログラムが解析できないのでエラーになってしまいますが、

「"」にはエスケープ機能があるのです。エスケープ文字は「\」です。

エスケープ文字とは、プログラムが通常はプログラムの一部として解釈する記号を「解釈しないで!!」とプログラムの一部から脱出(=エスケープ)させる機能を持ちます。

なので、このコンテキストでは

echo "He said "Hello" to you.";

echo "He said \"Hello\" to you.";

とすることによって通常は「"」を文字列の始まりと終わりとして解釈することをエスケープ文字で脱出、エスケープさせることができるのです。(エスケープしたい文字の直前に記述する必要があります)

なので、これでエラーにならずに

He said "Hello" to you.

と出力されるようになります。おわかりになりましたでしょうか?

「'」の致命的な弱点に戻りますが先程のエラー、

echo 'It's Monday.';

echo 'It\'s Monday.';

としても

It's Monday.

とはならず、

It\

と「\」も加えて出力され、基本、エラーのままです。

何故だかわかりますか?

そう、冒頭の説明に戻るように「'」は中身をそのまま出力するからです。「\」をエスケープ文字と解釈することすらできないのです。

なので、私は「'」の弱点を充分承知した上で、微々たるパフォーマンス向上と極力無駄を省きたい、と言う理由に「'」を沢山活用し、「"」と使い分けています。

そう言えば JAVA の volatile の説明で似たようなこと書いてあったな。。。「JAVA と PHP を一緒にするな!」、何なんでしょう、頭の中で全世界から叫び声が聞こえてきました。

PHP はスクリプト言語なのでその辺のパフォーマンスも考慮に入れる必要があります。冒頭で JavaScript も一緒、と書きましたが JavaScript は変数の解析はできませんね。PHP だけでは寂しいので残しておきます。

最後に、エスケープ文字「\」は「"」をエスケープする時以外にも使いますのでとりあえずこちらも覚えておきましょう。

とまぁ、以上が業務連絡です。メールにすると長いし、折角なのでブログの記事にしてみました。



広ブロっち♪ d(^-^)