文字列を記述する際、引用符・二重引用符を利用できます。
http://www.php.net/manual/ja/language.types.string.php
私は、文字列の中に特殊文字のエスケープシーケンスや変数が埋もれる?感じがいやで普段引用符を多用してます。
でも、巷のスクリプトを見ると、特殊文字のエスケープシーケンスや変数が含まれていない場合でも
比較的二重引用符が多用されているように思います。使い分けの基準となるようなものはあるのでしょうか?
また、ないとしても「考え方はこうだよ」といったことがあれば教えてください。
基本的にシングルクォーテーションを使います。
まず、シングルクォーテーションの方がダブルクォーテーションより処理速度が速いということがあります。
微妙な差なので、それほど意識する必要はないと思いますが、何千回と回すようなループもあるので、いちおう気にしています。
それより大きい理由が、セキュリティ対策です。
変数に不正な値が入ってきた場合、それを展開させたことでプログラムの動作が異常になることがあります。クロスサイトスクリプティングがその一例です。
とくに、配列変数の要素やファイル名、SQL文で文字列結合を行う場合は、異常がないかどうかバリデーションチェックするのが定石です。シングルクォーテーションを文字列結合を明示した方が、何かあったときに原因特定しやすいと思います。
私自身も二重引用符多用派ですね、なんでだろうかと考えてみると。
まずは、masashi0316さんも質問に書かれている「エスケープシーケンス」が鍵です。
文字列中に改行、タブといった制御文字を入れる場合は、二重引用符構文を使うことになります。
下記の2つは、ブラウザ画面はどちらも同じ結果になりますよね。
echo "<li>abc</li>\n<li>def</li>\n";
echo '<li>abc</li><li>def</li>';
HTMLソースが整形されている必要はないのですが、デバッグを考えると見やすい方が楽ではないでしょうか?。これはシンプルな例なので、さほど問題になりません。しかし、コードが長くなった場合、全てが1行のHTMLは全く見通しがつかないコードになってしまいます。
次に、変数埋め込みを使う理由ですが、こちらはコードをすっきりさせるため でしょうか。
printf('<li>%s</li>',$str);
echo('<li>'.$str.'</li>');
echo("<li>{$str}</li>");
いずれも同じ結果になります。引数が増えると、コードの見通しが悪くなるので、私は下の構文を使ってます(それと下の方が速そう(笑))。また、二重引用符と同等のヒアドキュメント構文ならば、
echo <<<HTML <tr> <th>{$label}</th> <td>{$data1}</td> <td>{$data2}</td> </tr> HTML;
と書けるので、簡易的なテンプレートとしてつかます。ロジック部分と表示部分を分けると、こちらもすっきりした記述ができます。
最後は推測になりますが、歴史を考えると、C言語は引用符は文字(1文字)、二重引用符は文字列を表すという言語仕様です。PHP言語の構文はC言語の流れを汲んでいるので、二重引用符を使うことが多いのではないかと思います。
# あうっ、K&Rが見つからない。
前半の見通しは、私の場合エディタ色分けの見易さで、
echo '<li>'.$str.'</li>'."\n";
とか書いちゃってます。
後半のC言語うんぬんはありえそうですね。
全般納得です。ありがとうございました。
他の方のご意見もうかがいたいので引き続きよろしくお願いします。
基本的にシングルクォーテーションを使います。
まず、シングルクォーテーションの方がダブルクォーテーションより処理速度が速いということがあります。
微妙な差なので、それほど意識する必要はないと思いますが、何千回と回すようなループもあるので、いちおう気にしています。
それより大きい理由が、セキュリティ対策です。
変数に不正な値が入ってきた場合、それを展開させたことでプログラムの動作が異常になることがあります。クロスサイトスクリプティングがその一例です。
とくに、配列変数の要素やファイル名、SQL文で文字列結合を行う場合は、異常がないかどうかバリデーションチェックするのが定石です。シングルクォーテーションを文字列結合を明示した方が、何かあったときに原因特定しやすいと思います。
意図した展開が展開しないことより、意図しない展開が展開されるほうが危ないですもんね。
(展開が多すぎて変な日本語ですが)
いつも通り説得力のあるご回答ありがとうございました。
すっきりしたのでこれにて終了します。
意図した展開が展開しないことより、意図しない展開が展開されるほうが危ないですもんね。
(展開が多すぎて変な日本語ですが)
いつも通り説得力のあるご回答ありがとうございました。
すっきりしたのでこれにて終了します。