Parallels Desktop 20%OFFセール中Check!

【PHP入門】ヒアドキュメントの使い方

PHPでヒアドキュメントを使う方法

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とみなされてしまうエラーです。

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のインデント幅のほうが大きいとエラーになるのでご注意ください。

でわでわ

プログラミング学習、お疲れさまです

プログラミングの独学に行き詰まっていませんか?誰かに相談したい、もっと効率よく学びたいなら、プログラミングスクールを検討してみてください。

PHPでヒアドキュメントを使う方法

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメントする

目次