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 のインデント仕様が原因です。本文と終了識別子のインデントを揃えるだけで解決できます。既存コードの互換性を保ちたい場合は、従来どおり終了識別子を行頭に置く方法をおすすめします。