PHPのヒアドキュメントは複数行の文字列を表現する際に非常に便利な構文です。この記事では、ヒアドキュメントの基本的な使い方から応用的な使い方、さらにはNowdoc構文について紹介します。
ヒアドキュメントの使い方
書式
PHPのヒアドキュメントは、<<<ID
で始まり、ID;
で終わります。これらの間に複数行の文字列が入ります。IDは任意の文字列を使うことができます。
<<<ID
複数行の文字列
複数行の文字列
複数行の文字列
ID;
- ヒアドキュメントは文字列をダブルクォーテーション
"..."
で括ったときとほぼ同じように動作します。 - スペースや改行はそのまま反映されます。
- ダブルクォーテーションはそのまま反映されます。
- 変数は展開されます。
- エスケープシーケンスは展開されます。
- 定数は展開されません。
基本的な使い方
基本的な使い方は次の通りです。
//変数に代入する例
$str = <<<EOD
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
EOD;
echo $str;
//echoに渡す例
echo <<<EOD
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
EOD;
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
IDの命名規則
PHPのヒアドキュメントのIDに使える文字は次の通りです。
- アルファベット
a-z
A-Z
(大文字・小文字を区別します) - 数字
0-9
- アンダースコア
_
- 日本語
先頭に数字を使うことはできません。
よく使われるIDは次の通りです。
EOD
(End Of Data|Document の略)EOF
(End Of File の略)EOM
(End Of Message の略)EOT
(End Of Text の略)END
どんなIDを使ってもいいのですが、3文字のアルファベット大文字を使うのが定番です。このルールに背くと、この業界で生きていくのは難しいとされています(嘘)。
変数を展開する方法
PHPのヒアドキュメント内では、変数を展開することができます。
$name = 'ウッカリカサゴ';
$str = <<<EOD
{$name}は、スズキ目メバル科に属する海水魚です。
EOD;
echo $str;
ウッカリカサゴは、スズキ目メバル科に属する海水魚です。
エスケープ処理とエスケープシーケンス
PHPのヒアドキュメント内で特定の文字をエスケープ処理したい場合は、バックスラッシュ\
を使います。
$name = 'ウッカリカサゴ';
$str = <<<EOD
変数 \$name の値は「ウッカリカサゴ」です
EOD;
echo $str;
変数 $name の値は「ウッカリカサゴ」です
また、\n
(改行)や\t
(タブ)のようなエスケープシーケンスを使用するとそれは展開されます。
よくあるエラー
開始IDの後に改行以外の文字がある
$str = <<<EOD //コメント
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
EOD;
Parse error: syntax error, unexpected ‘<<‘ (T_SL) in …
開始ID<<<EOD
の後は改行しなければなりません。なにか文字列があるとエラーになります。たとえコメントでもです。
終端IDの前に文字がある
$str = <<<EOD
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ? EOD;
Parse error: syntax error, unexpected end of file in …
原則として、終端のIDEOD;
の前に文字列があるとエラーになります。
ヒアドキュメント内にIDと同じ文字列で始まる行がある
$str = <<<EOD
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
EOD
EOD;
Parse error: syntax error, unexpected ‘EOD’ (T_STRING) in …
5行目のEOD
が終端IDとみなされてしまうエラーです。
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
Nowdocの使い方
Nowdocはヒアドキュメントとよく似た構文です。
ヒアドキュメントがダブルクォーテーションで括った場合とほぼ同じように動作するのに対し、Nowdocはシングルクォーテーションで括った場合とほぼ同じ動作をします。
ヒアドキュメント | Nowdoc | |
---|---|---|
スペース、改行 | そのまま表示 | そのまま表示 |
クォーテーション | そのまま表示 | そのまま表示 |
変数 | 展開される | 展開されない |
エスケープシーケンス | 展開される | 展開されない |
Nowdocの書式はヒアドキュメントとほぼ同じで、唯一の違いは始端IDをシングルクォーテーションで括ることです。終端IDは括りません。
$str = <<<'EOD'
\n は改行を表すエスケープシーケンスです。
\t はタブを表すエスケープシーケンスです。
EOD;
echo $str;
\n は改行を表すエスケープシーケンスです。
\t はタブを表すエスケープシーケンスです。
インデントで見やすくする
PHPのバージョン7.3未満では、ヒアドキュメントの終端IDをインデントすることができませんでした。例えば次のように書くとエラーになりました。
if ($flag) {
$str = <<<EOD
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
EOD;
}
なので次のように書かなければなりませんでした。
if ($flag) {
$str = <<<EOD
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
EOD;
}
すごく気持ち悪いですね。あなたもコードを見やすくするためにインデントを使っているかと思います。しかし、PHP 7.3未満では終端IDの前にいかなる文字も置くことができなかったため、このように書かなければなりませんでした。これが嫌でヒアドキュメントは使わないという人も多いそうです。
そして、PHP 7.3から終端IDをスペースまたはタブでインデントすることが可能になりました。いえい。しかも、終端IDのインデント幅と同じ分、文字列の各行からインデントが取り除かれるというオシャレ仕様です。
if ($flag) {
$str = <<<EOD
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
EOD;
}
echo $str;
朝はギリシャで魚釣り、
夜はベネズエラで鬼ごっこ、
これなーんだ?
ただし、文字列のインデント幅よりも、終端IDのインデント幅のほうが大きいとエラーになるのでご注意ください。
でわでわ
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
コメント