Help us understand the problem. What is going on with this article?

phpのコーテーション

More than 5 years have passed since last update.

phpのダブルコーテーションとシングルコーテーションを調べたのでメモ
phpのバージョンは5.3.15

$ php --version
PHP 5.3.15 with Suhosin-Patch (cli) (built: Aug 28 2012 18:19:13)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

読み方

まずコーテーションなのかクォーテーションなのか、
物によっては読み方色々でどっちが正しいのか不明だったので
Google翻訳さんに聞いてみました。

  • ダブルコーテーション => Double quotes
  • ダブルクォーテーション => Double quotes
  • Double quotes => 二重引用符
  • 二重引用符 => Double quotes

  • シングルコーテーション => Single quotes

  • シングルクォーテーション => Single quotes

  • Single quotes => 単一引用符

  • 単一引用符 => Single quotes

どっちでも良いかな。二重引用符とか単一引用符の方が噛まずに済みそうではある。

違い

  • ダブルクォーテーション  ・・・ 文字列中の変数を変数値に置換する
  • シングルクォーテーション ・・・ 文字列中の変数を変数値に置換しない

実行内容はこんな感じ

<?php
echo '\n'; # \n
echo "\n"; # 改行される

$pinch = '(/・ω・)/ピンチ!';

echo '\(・ω・\)SAN値!$pinch'; # \(・ω・\)SAN値!$pinch
echo "\(・ω・\)SAN値!$pinch"; # \(・ω・\)SAN値!(/・ω・)/ピンチ!

$str = 'c';

echo 'ab$strd'; # ab$strd
echo "ab$strd"; # ab
echo "ab $str d"; # ab c d
echo "ab$str d"; # abc d
echo "ab$strにd"; # ab
echo "ab{$str}d"; # abcd

class Huge{
  function foo() {
    return 'hi';
  }
}

$huge = new Huge;
echo "hoo $huge->foo()"; # hoo ()
echo "hoo {$huge->foo()}"; # hoo hi

実行速度

代入のみ

以下のようなプログラムを作成

singleQuotes.php
<?php
$start = time();
$count = 1000000000;
for ($i=0;$i<$count;$i++) {
  $str = 'hihi';
}
$end = time();

echo $end - $start . "\n";

$strへの代入を単一引用符から二重引用符へ変更したdoubleQuotes.phpも作成

$ diff doubleQuotes.php singleQuotes.php
5c5
<     $str = "hihi";
---
>     $str = 'hihi';

10回ずつ実行して平均値を比べる

$ for i in `seq 1 10`; do php singleQuotes.php ;done;
92
97
100
94
102
93
101
100
77
90
# 平均値 94.6
$ for i in `seq 1 10`; do php doubleQuotes.php ;done;
101
95
100
77
111
96
78
107
98
100
# 平均値 96.3

誤差と言っても良いぐらいの速度差ではある。

変数展開

変数展開の速度も試す

singleQuotes.php
<?php
$start = time();
$count = 1000000000;
$str1 = 'hi';
for ($i=0;$i<$count;$i++) {
    $str2 = 'hi' . $str1 . 'hi';
}
$end = time();

echo $end - $start . "\n";
$ diff singleQuotes.php doubleQuotes.php
6c6
<     $str2 = 'hi' . $str1 . 'hi';
---
>     $str2 = "hi{$str1}hi";

10回ずつ実行して平均値を比べる

$ for i in `seq 1 10`; do php singleQuotes.php ;done;
140
140
141
136
139
141
121
153
141
143
# 平均値 139.5
$ for i in `seq 1 10`; do php doubleQuotes.php ;done;
138
168
165
160
162
177
142
175
170
170
# 平均値 162.7

二重引用符での変数展開だと若干遅くなるみたい。

sprintf

ちなみにsprintfでの速度も見てみる

$ diff singleQuotes.php sprintf.php
6c6
<     $str2 = 'hi' . $str1 . 'hi';
---
>     $str2 = sprintf('hi%shi', $str1);

10回ずつ実行して平均値を比べる

$ for i in `seq 1 10`; do php sprintf.php ;done;
370
371
378
382
401
394
415
396
402
385
# 平均値 389.4

単一引用符に比べると3倍ほど時間がかかるようです。

まとめ

単一引用符早いってことでしょうか。
二重引用符だと見た目奇麗に書けるけども実行速度と相談でしょうか。
そんなに気にする物では無いかもですが。
sprintfはたまに使いますが使用回数多いところでは考えものかも知れませんね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした