【補足記事】ヒアドキュメントを避ける理由

こちらの記事の補足です。

「横長くなる文の扱い」という項目について
「これヒアドキュメントでもいいんじゃないの」
という声をいただいただきました。
こういうやつですね。

$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 も使えるし。

ただ、テンプレートエンジンやフレームワークを使っていると
そういう場面に出くわすことはあまり多くないような気もします。

ご意見ご質問ありがとうございました!

関連エントリ

  • このエントリーをはてなブックマークに追加

One Response to “【補足記事】ヒアドキュメントを避ける理由”

  • 通りすがり

    2010/12/09 10:49

    では、私がヒアドキュメントを愛好する理由を。
    Queryとかならあまり気にすることは無いですが、改行込みの”…”だと「先頭」「末尾」やいろんな所に余計な改行や空白が入ります。
    | $buf = ”
    | aaaa
    | bbb
    | “;
    で、それを避けたい時は
    | $buf = “aaaa
    |bbb
    |”;
    と書かなければならず、”aaa”と”bbb”のインデントがあわなくなります。
    だったら、
    | $buf = <<<EOB
    |aaaa
    |bbb
    |EOB
    の方が美しいので、"…"は基本的には使いません。