【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", [変数])」みたいにダブルクォーテーションを使う必要があることに注意してください。

 

 



投稿日:2018-07-20    更新日:2018-09-06

[スポンサーリンク]

関連記事
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
勉強した内容を緩くメモする|JBの技術メモ
サイト内検索
プロフィール

プロフィール

[Name : じゃぶじゃぶ(@jbjb_2019)]
都内で社内SEをしているおじさん。
仕事で得られる知識だけでは限界を感じ、 WEBの勉強がてらITブログを開始。
サーバからWEBサイトまでフルスクラッチで開発しました。
現在は勉強のモチベーションを保つために活用中。
興味があることを雑記的に書いていきます。

[スポンサーリンク]

[スポンサードリンク]