15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHP のヒアドキュメントで見落としがちなポイント(あるある単純ミス集)

Last updated at Posted at 2018-07-21

P.S. なんと PHP7.3 以降では下記制限の一部がなくなるそうです by @​rana_kualu​さん情報。関連情報「フレキシブルなheredocがやってくる」@ Qiita)


ヒアドキュメント専用「凡ミス集」

PHP で複数行を代入するためのヒアドキュメント構文 ("<<<") で、個人的にありがちなミスのチェック・リストです。

  1. 終端 ID(識別子)の ";" の後ろに改行コード以外の何かがある(空白、タブ、制御コードなど)
  2. 終端 ID(識別子)の前にタブやスペースなどでインデントしている
  3. 改行に OS の改行コードを使用していない
  4. 開始 ID(識別子)の後ろに改行コード以外の何かがある(空白、タブ、制御コードなど)
  5. ID の後ろにコメントを入れている

意外と大丈夫なパターン

$msg =<<<HEREDOC
  OK
HEREDOC;

$msg =<<< HEREDOC
  OK
HEREDOC;

$msg = <<< HEREDOC
  OK
HEREDOC;

他の言語のヒアドキュメントの構文と間違えてる

bashかよっ! 👋 バシッ
$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(識別子)の後ろに空白がありませんか?

最初のHEREDOCの後ろにスペースが入っている
<?php
$hoge = 'hoge';
echo <<< HEREDOC 
${hoge} is not fuga
piyo is not ${hoge}
HEREDOC;

もしくは echo <<<HEREDOC の開始 ID(識別子)の後ろにコメント入れてませんか?

最初のHEREDOCの後ろにコメントが入っている
<?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(識別子)の前後に空白などがありませんか?

最後のHEREDOCの前に空白がある(PHP>=7.3では大丈夫)
<?php
$hoge = 'hoge';
$fuga = <<< HEREDOC
    ${hoge} is not fuga
    piyo is not ${hoge}
    HEREDOC;
echo $fuga;

終端 ID(識別子)の後にコメント入れてませんか?

最後のEOTの後に空白やコメントがある(PHP>=7.3では大丈夫)
<?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

Invalid body indentation level

PHP 7.3 以降での問題は、最後の HEREDOC のインデントがヒアドキュメント内のインデントよりも深い場合です。

最後のHEREDOCのインデントが1スペースぶん多い
$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 方が早いのに。

15
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?