【PHP】シングルクォーテーション(')とダブルクォーテーション(")の違い
-
カテゴリ:
- PHP
PHPを書くとき、よく「シングルクォーテーション」と「ダブルクォーテーション」の違いを無視して書いていて、痛い目にあったことがあるのでメモしておきます。
【超概要】
- 「シングルクォーテーション」と「ダブルクォーテーション」の違いをご紹介
- 違いとしては、囲った文字を展開するか否か
- サンプルとして変数と改行コードを展開するサンプルをご紹介
- ダブルクォーテーションを使う際は変数の代入時と出力時の両方に気を付けること
「シングルクォーテーション」と「ダブルクォーテーション」の違いとして結論から言うと、クォーテーションで囲った文字を展開するかしないか、が大きな違いになります。
ここで言う展開とは、変数の中身を取り出すことを言います。
つまり、クォーテーションの中身を評価して、変数があれば変数の中身を取り出して表示します。
具体例を見てみましょう。
変数の中身を取り出して表示する
sample1.php
<?php
$value = 'aaa';
var_dump('single: $value');
var_dump("double: $value");
?>
結果
string(14) "single: $value"
string(12) "double: aaa"
シングルクォーテーションの場合は「$value」も文字列としてそのまま出力していますが、ダブルクォーテーションの場合は「$value」を変数と判断して中身の「aaa」を出力する違いがあります。
改行コードの出力
自分がシングルクォーテーションでよくミスすることが多いのが改行コード(\n、\r、\r\n)です。まずはサンプルを見て下さい。
sample2.php
<?php
$value1 = 'aaa\nbbb\nccc';
$value2 = "aaa\nbbb\nccc";
var_dump('single: $value1'); //ケース1
var_dump("double: $value1"); //ケース2
var_dump('single: $value2'); //ケース3
var_dump("double: $value2"); //ケース4
?>
結果
// ケース1
string(15) "single: $value1"
// ケース2
string(22) "double: aaa\nbbb\nccc"
// ケース3
string(15) "single: $value2"
// ケース4
string(20) "double: aaa
bbb
ccc"
ポイントは2つあり、変数に値を代入する時と出力する時に注意が必要です。
「$value1」ではシングルクォーテーションで変数を代入しています。ケース1ではシングルクォーテーションで出力しているので変数が展開されませんが、ケース2では展開されて変数の中身が出力されています。しかし変数値の改行コードがそのまま文字列として出力されてしまっています。
これは変数の代入時にシングルクォーテーションで囲っていたため、改行コードを「\n」の文字列として格納されているからです。
次に「$value2」では変数の代入にダブルクォーテーションを使っています。こうすることで変数には「\n」が改行コードとして格納されるので、ケース4のようにダブルクォーテーションで出力することで、文字がちゃんと改行されて表示されます。
さらに改行コードでやりがちなミスとして、explode()を使った例を挙げておきます。
sample3.php
<?php
$value1 = 'aaa\nbbb\nccc';
$value2 = "aaa
bbb
ccc";
/* 「$value2」は以下のような書き方と同じ
$value2 = "aaa\nbbb\nccc";
*/
var_dump(explode('\n', $value1)); //ケース1
var_dump(explode("\n", $value1)); //ケース2
var_dump(explode('\n', $value2)); //ケース3
var_dump(explode("\n", $value2)); //ケース4
?>
結果
// ケース1(「\n」の文字列ごと分割されている)
array(3) {
[0]=>
string(3) "aaa"
[1]=>
string(3) "bbb"
[2]=>
string(3) "ccc"
}
// ケース2(「\n」を改行コードとして扱っているため分割されない)
array(1) {
[0]=>
string(13) "aaa\nbbb\nccc"
}
// ケース3(「\n」を文字列として扱っているため分割されない)
array(1) {
[0]=>
string(13) "aaa
bbb
ccc"
}
// ケース4(「\n」の改行コードごと分割されている)
array(3) {
[0]=>
string(3) "aaa"
[1]=>
string(3) "bbb"
[2]=>
string(3) "ccc"
}
改行を含む文字列を改行コードごと分割して配列するケースをイメージしてください。「explode('\n', [変数])」というようにシングルクォーテーションを使ってしまうと、ケース2のように行ごとうまく分割されません。
ケース4のような形で改行ごと分割された配列を作るためには「explode("\n", [変数])」みたいにダブルクォーテーションを使う必要があることに注意してください。