【PHP】’(シングルクォーテーション)と”(ダブルクォーテーション)はどちらを使うべきか(PHP高速化)

WEB制作・開発実例・コラム
2019.08.30
2019.10.03

PHPで文字列を扱う際には’(シングルクォーテーション)と”(ダブルクォーテーション)である。
それぞれの特徴として

  • シングルクォーテーション:囲った中身を文字列として扱い、変数、制御文字列もただの文字列として扱う
  • ダブルクォーテーション:囲った中身を文字列として扱うが、変数、制御文字列は元々の元として扱う

  • 一般的に全て文字列として扱う為、コード内の文字列はシングルクォーテーションで囲うほうが速度が早く良いと言われています。
    本当に全てをシングルクォーテーションに変えたほうがシステムとして良いのか検証してみたいと思います。

    動作の違い

    変数や制御文字列の扱いが異なると記述しましたが、具体的にどう異なるのかを解説します。
    PHPで以下の記述を行った際に出力結果がどう変わるのかをまとめました。
    実行コード
    $str = "文字列";
    echo '表示$str';
    echo "表示$str";
    echo "表示{$str}";
    echo '表示文字列\n';
    echo "表示文字列\n";
    
    出力結果
    表示$str
    表示文字列
    表示文字列
    表示文字列\n
    表示文字列(表示上改行される)
    
    シングルクォーテーションの場合は制御文字列、変数がそのまま文字列として出力されています。
    しかし、ダブルクォーテーションはそのまま変数中身や制御文字列として出力しています。
    これは文字列連結を行う上で可読性がかなり高くなります。
    しかし、外部から何が入ってくるかわからない場合は、外部から制御文字列などを入力されてしまう危険性があります。
    ですので可読性とセキュリティを考えどのような文字列なのかを考えたほうが良いでしょう。

    また、”表示$str”、”表示{$str}”この2つの記述は同じ結果になりますが
    渡ってくる変数が配列だった場合
    echo "表示$str['str']";
    echo "表示{$str['str']}";
    
    この2種類のコードを動作させた場合
    上はエラーになり、下は正常に動作するといった差が出てきます。

    単純代入の場合の速度比較

    以下のコードでクォートを変え速度比較を行います。
    for ($i=0; $i<=100000000;$i++) {
        $str = "abcdefghijklmno";
    }
    
    • 1バイト文字列の場合
  • シングルクォーテーション
  • real	0m4.175s
    user	0m4.157s
     sys	0m0.006s
    
  • ダブルクォーテーション
  • real	0m4.148s
    user	0m4.126s
     sys	0m0.012s
    
    • 2バイト文字列の場合
  • シングルクォーテーション
  • real	0m4.071s
    user	0m4.050s
     sys	0m0.010s
    
  • ダブルクォーテーション
  • real	0m4.133s
    user	0m4.115s
     sys	0m0.013s
    
    確かにシングルクォーテーションの方が全ての場合で早くなりました
    1億回繰り返して速度差は一番大きいところで0.6msとなっていました。
    つまりシングルクォーテーションとダブルクォーテーション1個分の差は0.000000006msの差が出ています。

    文字列連結する場合の速度比較

    以下のコードでクォートを変え速度比較を行います。

    $str_tmp = 'abcdefghijklmno';
    for ($i=0; $i<=100000000;$i++) {
        $str = 'abcdefghijklmno'.$str_tmp;
    }
    

  • シングルクォーテーション
  • real	0m7.122s
    user	0m7.062s
     sys	0m0.047s
    
  • ダブルクォーテーション
  • real	0m9.014s
    user	0m8.930s
     sys	0m0.066s
    
    文字列を連結するという処理が入る為、単純な代入よりも時間がかかっています。
    シングルクォーテーションとダブルクォーテーションの速度差もほぼ無い状態でした。

    文字列比較する場合の速度比較

    以下のコードでクォートを変え速度比較を行います。
    $str = "abcdefghijklmno";
    for ($i=0; $i<=100000000;$i++) {
        if ($str == "abcdefghijklmno") {
        }
    } 
    
  • シングルクォーテーション
  • real	0m5.088s
    user	0m5.068s
     sys	0m0.009s
    
  • ダブルクォーテーション
  • real	0m4.976s
    user	0m4.963s
     sys	0m0.009s
    
    こちらは代入と比べ格段速度が早いようです。
    シングルクォーテーションとダブルクォーテーションの速度差も無い為、どちらを採用しても問題がなさそうです

    どちらを使用したほうが良いのか

    やはり、一般的に言われているようにシングルクォーテーションを使用したほうがシステムとしては僅かですが早くなると思います。
    特に大規模で、多量のアクセスを裁かなければならないシステム程この効果は大きいでしょう。
    ですが、文字列を連結する際は文字列の中に変数を直接記述できるダブルクォーテーションの方が可読性が高いです。
    ですので、基本的にシングルクォーテーションを使用し、必要な箇所でダブルクォーテーションを使用するように心がける事で
    より質の高いシステムを組むことができると思われます。

    SEOやWEB制作に関する情報を検索

    コラム

    ピックアップコラム

    最新コラム

    人気コラム

    過去の記事

    ご質問やご相談などお気軽にお問い合わせください。

    お電話でのお問い合わせはこちら

    03-5829-9912

    受付時間:平日10:00~19:00(土・日・祝日を除く)