【PHP】Parse error「Invalid body indentation level」の原因と解決策(Heredoc/Nowdoc)

【PHP】Parse error「Invalid body indentation level」の原因と解決策(Heredoc/Nowdoc) PHP

PHP で Heredoc / Nowdoc 構文を使う際に、以下のようなエラーが出ることがあります。

Parse error: Invalid body indentation level (expecting an indentation level of at least X) in ...

これは PHP 7.3 以降で追加された「インデント付き Heredoc/Nowdoc 構文」に関する仕様変更が原因です。本記事ではエラーが発生する理由と、正しい書き方や解決策を解説します。

エラーが出る原因

Heredoc/Nowdoc の終了識別子(例:EOF)の位置が正しく揃っていない場合に、このエラーが出ます。PHP 7.3 からは終了識別子をインデントできるようになりましたが、その場合「本文のすべての行が同じインデント幅以上である必要」があります。

<?php
$str = <<<EOF
    この行はインデントあり
  この行はインデント幅が異なる   // ← エラーの原因
EOF;

上記では、インデントが行ごとに揃っていないため「Invalid body indentation level」となります。

正しい書き方(インデントを揃える)

本文のすべての行を終了識別子の位置に合わせるか、同じインデント幅で揃える必要があります。

<?php
// インデントなし
$str = <<<EOF
この行はOK
この行もOK
EOF;

// インデントあり(全行揃える)
$str2 = <<<EOF
    行1
    行2
    行3
    EOF;

Nowdocでも同様

Nowdoc(<<<'EOF')も同じルールが適用されます。

<?php
$code = <<<'PHP'
    function test() {
        return "Hello";
    }
    PHP;

解決策まとめ

  • 終了識別子(EOF など)は行頭または一定のインデント位置に固定する
  • 本文のすべての行を同じインデント幅で揃える
  • 古いコードでエラーが出る場合は、終了識別子をインデントせずに行頭に置くのが安全

まとめ

Parse error「Invalid body indentation level」は、PHP 7.3 以降の Heredoc/Nowdoc のインデント仕様が原因です。本文と終了識別子のインデントを揃えるだけで解決できます。既存コードの互換性を保ちたい場合は、従来どおり終了識別子を行頭に置く方法をおすすめします。