Infochowder

色々な情報がギュッと詰まったサイト

ヒアドキュメントのエラー発生原因

投稿日: 2017年11月13日

先日、お問い合わせフォームをPHPで作っていた時、返信メールの内容をヒアドキュメントに記述すると「syntax error: unexpected end of file」。そのエラー原因は意外なものでした。


//返信メール本文 ヒアドキュメント
    $mail->Body = <<<EOT
(メール本文内容)
    EOT;

としたところ、「syntax error: unexpected end of file」。エラー内容から言ったら、該当する部分の前にセミコロンを付け忘れているか、スクリプトの綴りミスなどでスクリプトが正常に動作していないか、そんなところだろうと思っていたのですが、そうした状況ではありませんでした。しかも、Cloud9ではEOT;の部分でエラーが発生しています。

エラー原因は意外なもの

ならば、EOTが違うのか? 他のサイトを参考にしても、EOTそのものはABC等でも動作し、開始に「>>>EOT」、終了に「EOT;」と同じ文字列を使用し、セミコロンさえ忘れなければ動作するようです。ということはEOTが違うわけではない。でも、エラーはそこで発生している、前後には特にエラーとなりそうな部分は見つからない。

もう少し調べていくと、ヒアドキュメントの開始に使う文字列を開始識別子、最後を終了識別子というそうで、「終了識別子の前後には文字列を入れてはいけない」という原則があります。つまり、終了識別子は行頭に書き、後ろにはセミコロンと改行のみ記述する、ということです。

私の場合、インデントでタブを挿入しています。このEOT;の前のタブを削除したら、このエラーは消え、正常に動作しました。インデントでタブやスペースを入れるのはコードを見やすくするために必要なのですが、一見すると正しく記述されているので要注意ですね。

今回の場合はインデントは一つとはいえ、ヒアドキュメント内でインデントがなくなるのはどうにも変な感じがしますね。前後にコメントアウトを入れるなどして、ヒアドキュメントを他とは違うと明示しておくといいかと思います。