こちらの記事の補足です。
「横長くなる文の扱い」という項目について
「これヒアドキュメントでもいいんじゃないの」
という声をいただいただきました。
こういうやつですね。
$query = <<<EOQ SELECT * FROM `posts` WHERE `user_id` = {$user['id']} ORDER BY `created_at` DESC LIMIT 10; EOQ;
EOQ の部分は終端識別子と呼ばれるもので
いま適当に End Of Query の略を使ったけど
ここは未定義の好きな文字列が使えますね。
ただこれ、
必要なとき以外は使わないようにしてます。
理由のひとつは、書くのがめんどくさいから。
わざわざ終端識別子を定義してそれで締めるより"
の方がずっと楽ちんです。
それより大きな理由は、インデントが崩れるから。
終端識別子の部分は必ず行頭から始めないといけないので
さっきの代入部分がインデントされていたらこうなります。
$query = <<<EOQ SELECT * FROM `posts` WHERE `user_id` = {$user['id']} ORDER BY `created_at` DESC LIMIT 10; EOQ;
この程度のインデントならまだいいけど
もっと複雑に入り組んでるときなんかは
これをやるとコードが読みにくくなっちゃう。
もちろん絶対に使わないということではなくて
- シングルクォート ‘ もダブルクォート ” も含んだ文字列
- ダブルクォートを含み、変数を展開する必要がある文字列
をエスケープ文字 \ を使わずそのまま記述したいという場合は
ヒアドキュメントを使うことになりますね。
変数を展開しないなら PHP 5.3 からは Nowdoc も使えるし。
ただ、テンプレートエンジンやフレームワークを使っていると
そういう場面に出くわすことはあまり多くないような気もします。
ご意見ご質問ありがとうございました!
2010/12/09 10:49
では、私がヒアドキュメントを愛好する理由を。
Queryとかならあまり気にすることは無いですが、改行込みの”…”だと「先頭」「末尾」やいろんな所に余計な改行や空白が入ります。
| $buf = ”
| aaaa
| bbb
| “;
で、それを避けたい時は
| $buf = “aaaa
|bbb
|”;
と書かなければならず、”aaa”と”bbb”のインデントがあわなくなります。
だったら、
| $buf = <<<EOB
|aaaa
|bbb
|EOB
の方が美しいので、"…"は基本的には使いません。