【PHP】ダブルクォートとシングルクォートの違いと使い分け

PHP-ダブルクォートとシングルクォートの違いと使い分け PHP

PHPでは、文字列の括りにダブルクォーテーションとシングルクォーテーションが使用できます。
この2つは意味合いが異なりますので注意が必要です。

PHPにおける文字列の扱い方

PHPにおいて、文字列はシングルクォートで囲まれたものや、ダブルクォートで囲まれたものとして表現されます。
例えば、以下のようなコードです。

$name = 'World';
$message = "Hello $name!";

上記の例では、$name変数に"World"という文字列が代入され、$message変数には"Hello World!"という文字列が代入されています。
文字列をダブルクォートで囲むと、変数展開が可能になります。
一方、シングルクォートで囲むと変数展開が行われず、そのまま文字列として扱われます。

ダブルクォートとシングルクォートの違いと使い分け

ダブルクォートとシングルクォートは、文字列を表現する方法としてはほぼ同じですが、いくつかの違いがあります。

まず、ダブルクォートで囲まれた文字列には変数展開が可能です。また、エスケープシーケンス(\nや\tなど)も使用できます。一方、シングルクォートで囲まれた文字列には変数展開ができず、エスケープシーケンスも使用できません。

例えば、以下のようなコードを考えてみましょう。

$name = 'World';
$message1 = "Hello $name!";
$message2 = 'Hello $name!';

$message1では、$name変数の値が展開された"Hello World!"が代入されますが、$message2ではシングルクォートで囲まれているため$name変数の値が展開されず、そのまま"Hello $name!"という文字列が代入されます。

また、ダブルクォートで囲まれた文字列の中で、{}で囲んだ部分を変数名として認識させることができます。例えば、以下のようなコードです。

$name = 'World';
$message = "Hello {$name}s!";

この場合、$messageには"Hello Worlds!"という文字列が代入されます。
$name変数の後にsを付けたい場合、{}で囲って変数名を指定することで実現できます。

ダブルクォート

メリット

文字列内に変数や関数を展開できて便利

文字列内に変数や関数を展開するという便利で、どんな文字列となるか分かりやすいです。
例えば、以下のようなコードです。

$price = 1000;
$tax = 0.08;
$withTax = fn() => $price * (1 + $tax);
$message = "価格は{$price}円(税込み{$withTax()}円)です。";

上記の例では、$price変数には1000が代入され、$tax変数には0.08が代入されています。
$message変数には、ダブルクォート内で{}で囲んだ$price変数を展開し、$priceと$taxを掛けた値を計算する$withTax関数を文字列に結合させています。
このように、ダブルクォートを使用することで、文字列の中で簡単に変数や関数を展開できます。

エスケープシーケンスが利用できる

改行文字(¥n)やタブ文字(¥t)などが利用できるため、TSV(タブ文字区切のデータ)や、バッチなどのコンソール用のプログラムを作る場合に活躍します。

デメリット

外部から中身が来た場合に危険性がある

変数内に外部から渡された何が入っているかわからない値の場合、制御文字などが入力されていて危険な場合があります。
ビープ音がなる文字などがあったり、インジェクション攻撃を受けたりするので要注意です。

定数が展開できない

例えば、以下のようなコードです。

define("NAME", "Kouji");
$message = "Hello {NAME}!";
// Hello {NAME}!

これを回避するためにはラムダ関数を作成することで解決できます。

define("NAME", "Kouji");
$_ = fn($name) => $name;
$message = "Hello {$_(NAME)}!";
// Hello Kouji!

{}で囲まない場合に可読性が悪い

変数の区切りが分かりにくくなり、バグの原因になります。
例えば、以下のようなコードです。

$name = 'World';
$names = 'Galaxy';
$message = "Hello $names!";
// Hello Galaxy!

一見すると$nameと$namesのどちらが展開されるかが分かりません。
この例であれば分かりやすいですですが、プログラムの先頭に$namesがあり、最後の方で$nameを定義して利用した場合に、バグの特定が非常に難しいです。
また、多人数で開発や、他人にプログラムを引き継ぐ、または引き継いだ場合に困ることが多いです。

シングルクォート

メリット

処理が早い

ダブルクォートの場合は変数展開などがないか解釈しながら処理するため、その必要がない分シングルクォートの方が早いです。

デメリット

プログラムが長くなる

変数展開ができないため、文字列内に変数の値を埋め込むことができません。
そのため、変数の値を連結して文字列を作る必要があります。
また、エスケープシーケンスも使用できないため、バックスラッシュを使った特殊な文字の扱いには注意が必要です。

例えば、以下のようなコードを考えてみましょう。

$message1 = 'It\'s a pen.';
$message2 = 'C:\\xampp\\htdocs';
$name = 'Kouji';
$message3 = 'あなたの名前は' . $name . 'さんです';

$message1では、シングルクォートで囲まれた文字列内にシングルクォートを含む場合、バックスラッシュを使ってエスケープする必要があります。
$message2では、Windows環境でのパス表現に必要なバックスラッシュを、2つ重ねてエスケープしています。
$message3では、変数を埋め込むことができないため、文字列と連結をしています。

まとめ

PHPにおける文字列の扱い方について、ダブルクォートとシングルクォートの違いについて説明しました。
ダブルクォートは変数の展開やエスケープシーケンスが使用できるため、柔軟に文字列を扱うことができます。一方、シングルクォートは変数展開ができず、エスケープシーケンスの使用にも注意が必要ですが、ダブルクォートよりも高速に処理することができます。

Follow me!

\このブログが役に立ったらサポートお願いします/

Follow me!

PHP
千原 耕司をフォローする

コメント

PAGE TOP
タイトルとURLをコピーしました