(P.S. なんと PHP7.3 以降では下記制限の一部がなくなるそうです by @rana_kualuさん情報。関連情報「フレキシブルなheredocがやってくる」@ Qiita)
ヒアドキュメント専用「凡ミス集」
PHP で複数行を代入するためのヒアドキュメント構文 ("<<<
") で、個人的にありがちなミスのチェック・リストです。
- 終端 ID(識別子)の "
;
" の後ろに改行コード以外の何かがある(空白、タブ、制御コードなど) - 終端 ID(識別子)の前にタブやスペースなどでインデントしている
- 改行に OS の改行コードを使用していない
- 開始 ID(識別子)の後ろに改行コード以外の何かがある(空白、タブ、制御コードなど)
- ID の後ろにコメントを入れている
意外と大丈夫なパターン
$msg =<<<HEREDOC
OK
HEREDOC;
$msg =<<< HEREDOC
OK
HEREDOC;
$msg = <<< HEREDOC
OK
HEREDOC;
他の言語のヒアドキュメントの構文と間違えてる
$msg = << HEREDOC
OK
HEREDOC
エラーメッセージから判断
unexpected '<<' (T_SL) in
「
Parse error: syntax error, unexpected '<<' (T_SL) in ... on line
」
「Fatal error: Uncaught Error: syntax error, unexpected T_SL in
」
echo <<<HEREDOC
の開始 ID(識別子)の後ろに空白がありませんか?
<?php
$hoge = 'hoge';
echo <<< HEREDOC
${hoge} is not fuga
piyo is not ${hoge}
HEREDOC;
もしくは echo <<<HEREDOC
の開始 ID(識別子)の後ろにコメント入れてませんか?
<?php
$hoge = 'hoge';
echo <<< HEREDOC //mogera
${hoge} is not fuga
piyo is not ${hoge}
HEREDOC;
PHP Parse error: syntax error, unexpected '<<' (T_SL) in /workspace/Main.php on line 3
上記は PHP7.3 でも NG でした。
unexpected end of file in
Unterminated heredoc at end of file
「
Parse error: syntax error, unexpected end of file in ... on line
」
「Fatal error: Uncaught Error: Unterminated heredoc at end of file (Line:.., Char:..)
」
「Parse error: Invalid body indentation level (expecting an indentation level of at least ...) in ... on line
終端 ID(識別子)の前後に空白などがありませんか?
<?php
$hoge = 'hoge';
$fuga = <<< HEREDOC
${hoge} is not fuga
piyo is not ${hoge}
HEREDOC;
echo $fuga;
終端 ID(識別子)の後にコメント入れてませんか?
<?php
$hoge = 'hoge';
if (empty($msg)){
$msg = <<< HEREDOC
{$hoge} is not fuga
HEREDOC; //piyo
}
上記は PHP7.3 では大丈夫でした。PHP7.3 では最後の HEREDOC
のインデント・レベルを基準に、左インデントをトリムしてくれるようです。
<?php
$fuga = <<< HEREDOC
${hoge} is hoge
but fuga is not ${hoge}
HEREDOC;
echo $fuga, PHP_EOL;
hoge is hoge
but fuga is not hoge
- オンラインで動作を見る @ paiza.IO
Invalid body indentation level
PHP 7.3 以降での問題は、最後の HEREDOC
のインデントがヒアドキュメント内のインデントよりも深い場合です。
$fuga = <<< HEREDOC
${hoge} is hoge
but fuga is not ${hoge}
HEREDOC;
echo $fuga, PHP_EOL;
PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 5) in /workspace/Main.php on line 4
TS;DR(所感)
わかっちゃいるけど、コード・エディタ使っていないと沼にハマることが多いので、自分への戒め。ググっても Qiita では基本すぎてストレートにヒットしないので、自分のググラビリティをごまかす Qiita 依存を高めるための記事です。
ああ、何度同じ問題で悩むのだろう。Qiita 方が早いのに。