さて、僕も今年コードを書き始め、PHPを触るようになりましたが、もともとC言語を触っていたこともあり最初の頃は""で文字列を書いていました。
ただ、速度やただの文字だとわかりやすいから変数を含まない場合は''(シングルクォーテーション)を使ったほうがいいよ〜、と、レビューをいただきました。
ただ、個人的に""だけ使うのがいいのでは...?
と思い、気になったのでもう少し調べてみました。
''と""の違い
端的に''(シングルクォーテーション)を使った時、(ダブルクォーテーション)を使った時の違いを解説すると...
"変数を展開してくれるかしてくれないか"
です。
$single = 'てくてくテック'; // てくてくテック
$double = "てくてくテック"; // てくてくテック
$hoge = "これが{$singe}だよ〜"; // これがてくてくテックだよ〜
$huga = 'これが{$singe}だよ〜'; // これが{$tech}だよ〜
例えばこんな感じにしておくと、クォートの違いで$techは文字列、$hogeは変数を含む文字列ということがわかります。
$hogeには$techが入っていますが、もしもすべてそのままの文字列として表現されたら"これが{$tech}だよ〜"となるはずです。
シングルクォートではそうなるんですが、ダブルクォートではちゃんと"変数展開"されるんです。
速度について
前述の通り、ダブルクォートの方が少し上位互換なんですね。
そのおかげで、ダブルクォートをつかうと、速度が落ちる傾向があるとちらほら言われていますね。
では、以下にてベンチマークテストの結果をみてみましょう。
Is a there a difference in using double (") and single (') quotes for strings. Call 1'000x
と書かれたところで結果が確認できます。
ん〜...
みたところ空文字を1000回代入している時の速度はときはシングルクォートのほうが遅いですね...
他もさして大差はないようです...
結論として、どっちでもええよ〜って感じです。
stack overflowでも同じく議論されていました。
こちらでもそんなこと(速度の違い)はきにするなと。
むしろ別の要因で決めるべきだよ〜って感じみたいですね!
そしてこちら、個人のブログのようですが...
ガン否定してますねw
シングルクォーテーションのパフォーマンス神話が正しくないことを証明する〜といった趣旨です。
簡単にまとめると...
- 実行時間に影響は全くない(構文解析はそれ以前にされる)
- コンパイル時間もほぼ一緒
- 文字列結合は場合による
といった具合でした。
表示に関しては速度に違いはない。
結合に関しては"hoge" . $huga と、"hoge $huga"の二種類を比較していますね。
結論としては変数が少ない場合ドットを使った結合が、そうでないならダブルクォートの中に埋め込む方が早いという結果になったそうです。(PHPのバージョンが古めなので、そのまま参考になるかはなんともですが...)
以上から、速さに関しては気にしなくて大丈夫でしょう。
どんな要因に気をつけるべき?
速さはどうでもいいことはおわかりいただけたかと思います。
次に、僕が思うどんな要因に気をつけて使い分ければいいのかを挙げてみます。
- 可読性、メンテナンス性を考慮して一方に揃える
- ルールを決めて使い分ける
おおまかに上記のどちらかの方針になるでしょう。
可読性、メンテナンス性を考慮して一方に揃える
個人的にはこっちがいいと思ってます。
なぜなら...
- 明確にどちらか決まっている方が書きやすいし読みやすい
- 中身の変更による修正(シングル->ダブル, ダブル->シングル)が必要ない
からです。
明確に決まっていると書いてる時に迷ったりしません。
また、ある程度認知されるまでは変わらないかもしれないけど、間違えて使ってしまい、レビューで指摘されて修正して〜といった無駄な時間も減っていくでしょう。
さらに、どちらとも使うような運用の場合、例えば変数がある場合は""で、ない場合は''でとしていたとして、変数を使うように、あるいは使わないように表示内容が変わった場合、""を''に、''を""に修正する必要が出てきます。
ほんの小さなことですが、ちりつもやまとなでこです。
デメリットをあげるならば、一部コーディング手法に制限がかかってしまうことでしょうか...
例えば文字列に変数を出す場合、シングルクォート統一していた場合、
$hoge = 'hoge' . $huga;
というふうに結合させなければいけません。
ダブルクォートが使えた場合、
$hoge = "hoge{$huga}";
もできるので、コーディングの幅が広がります。
逆にダブルクォートで統一しておけば...何も困らないのかな...?(ちょっと思い浮かばなかったです...
ルールを決めて使い分ける
さて、そしてこちらが現在僕のチームでもやっている運用です。
うちではただの変数を含まない文字列に対しては''、逆に変数を含む文字列に対しては""を使うようにしています。
こうしておけば、クォートの違いで変数を含むかどうかを判断できます。(意味あるか微妙だけど...w
他にも例えばですが...
クラスのプロパティの定数部分にのみ''、他は""とかしておくと、定数を検索したい時はシングルクォートで〜とかできたりするのかもしれません。
何かしらの特殊な役割があるけど、違いがわかりづらい文字列に対してシングルクォート使うとかすると少しは使えるのかな...?
わかんないですw
まとめ
速度に関しては違いがないことがわかりました。
また、なんとな〜くどんな使い分けがいいのかも考えられたのかなぁ...(いまだに微妙ですけど。
とりあえず全部ダブルクォーテーションでいいんじゃないのかなっていうのが素直な気持ちです...
逆にシングルクォーテーションじゃないとダメなケースってあるんだろうか・・・?
USキーボードではShift無しにシングルクォートが打てるようで、それが理由でそっちがいいんじゃない?って意見もありましたが...(ダブルはShift押さないとだめ)
どちらにせよ、速度の違いはないので、それぞれのルールに従って書いて、可読性とメンテナンス性が維持できればどうでもいいと思います。
ちゃんとそれなりの理由があるルールであればそれに従っておいていいでしょう!
特に使い分けていないなら今一度考えてみてもいいかもしれませんね!
それでわ!