phpでヒアドキュメントを使うときにありがちなミス
PHP
ヒアドキュメントはあまり使うことがないと思うので、たまに使うとうまく記述できず、エラーになることが多々あります。
結論を言うと、ヒアドキュメントの終了識別子をインデントしていることが問題でした。この記事ではそのときの詳細を再現して説明します。
そもそもヒアドキュメントとは?
ヒアドキュメントは、IDとなる識別子の頭に<<<をつけることで、文字列の開始を宣言できます。宣言から識別子とセミコロンまでの間を文字列と見なします。
ダブルクォーテーションと囲ったときとほぼ同じで、中に書かれた変数は展開されます。
識別子はABCでもAAAでもなんでもいいのですが、EODやEOF、EOMなどがよく使われますね。
それぞれEnd of Document、End of File、End of Messageの略です。
ダブルクォーテーションで囲ったときとの違いは、特殊文字のエスケープを必要としないので、htmlを文字列として変数に格納したりするときに便利な構文です。
僕が犯したミス
ヒアドキュメントの練習をちょっとしたくらいだとなかなか気がつけないミスです。
以下、ミスのあるソースコード。
<?php
$w = date('w'); //曜日(数値)取得
switch ($w) {
case 0://日曜日
case 6://土曜日
$hoge = <<<EOD
<p class="foo">今日は休日です。</p>
EOD;
break;
default:
$hoge = <<<EOD
<p class="bar">今日は平日です。</p>
EOD;
}
echo $hoge; //平日なら今日は平日です、休日なら今日は休日ですと出力されるはず
switch文を使っていますね。if文for文でもなんでもいいですが、これがミソだったりします。
冒頭にも書きましたが、「EOD;」部分でインデントしていることが問題です。見やすく整形したのが裏目に出て、エラーを起こす要因になっているのですね。
実はphpのヒアドキュメントでは、終了識別子(今回の場合はEOD;)の行には、終了識別子以外を記述してはいけないという決まりがあります。
つまり、以下のようなソースコードでもエラーになります。
<?php
echo <<<EOD
Hello World!
EOD; ?>
この場合だと、終了識別子のあとにphpの閉じタグを記述しているのでエラー。 ヒアドキュメントは便利な面もありますが、あまり融通の効かない構文なのです。
正しい記述
よって、先述のswitch文を正しく記述すると以下のようになります。
<?php
$w = date('w'); //曜日(数値)取得
switch ($w) {
case 0://日曜日
case 6://土曜日
$hoge = <<<EOD
<p class="foo">今日は休日です。</p>
EOD;
break;
default:
$hoge = <<<EOD
<p class="bar">今日は平日です。</p>
EOD;
}
echo $hoge; //平日なら今日は平日です、休日なら今日は休日ですと出力される
なんだかとても気持ち悪いですが、決まりなのでこうするしかありません。
広告