PHPで改行混じりの長文などを出力する際に便利な、ヒアドキュメントをご紹介します。
ダブルクォートで囲わなくても、エスケープを気にせずとも簡単に出力できますが、思わぬエラーで軽くハマることもありました。
ヒアドキュメント構文のよくあるエラー解決法もご紹介します。
目次
ヒアドキュメントの基本
ヒアドキュメントの書き方
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php // ↓ヒアドキュメント始まり // EOD という開始IDを指定 echo <<<EOD ヒアドキュメントで、<br> テキスト出力も自由自在!! EOD; // ↑ヒアドキュメント終わり // 開始IDと同じ EOD というIDで閉じる ?> |
ヒアドキュメントで、
テキスト出力も自由自在!!
EOD
というIDに挟まれたエリアに入力されたテキストが表示され、しかも改行タグも反映されました。
ヒアドキュメントの構文
<<<開始ID
文字列
終端ID;
<<<
のあとに開始IDを入れ、最後にも同じ終端IDを入れます。
(上記サンプルでは EOD)
IDの命名ルール
ヒアドキュメントのID名は、以下のルールに気を付けて命名しましょう。
- 開始ID、終端IDは必ず同じ名前にする
- IDはアルファベット大文字・小文字、日本語でもOKだが、アルファベット大文字が基本
- 数字を先頭にしてはいけない
- 記号は
_
(アンダースコア)のみ可
ちなみによくあるID名は以下のとおりです。
- EOD(End of Document)
- EOM(End of Message)
- EOF(End of File)
上記いずれかのID名を付けるのが一般的です。
ヒアドキュメントでよくあるエラー
終端IDの後には改行を入れること
終端IDの後には改行を入れないとエラーになります。
エラー構文
1 2 3 4 5 6 7 |
<?php echo <<<EOD ヒアドキュメントで、<br> テキスト出力も自由自在!! EOD; ?> // ↑終端IDの後に改行していない |
エラーメッセージ
Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T_END_HEREDOC) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in…
「構文エラーだ、予期しない終わり方だよ…」と突っ込まれています。
最後は必ず改行をしましょう。
終端IDの前後に文字列を入れてはいけない
終端IDの前後に空白やインデント、コメントなど何らかの文字列が入るとエラーになります。
エラー構文
1 2 3 4 5 6 7 8 |
<?php echo <<<EOD ヒアドキュメントで、<br> テキスト出力も自由自在!! EOD; // 終端ID // ↑終端IDの前に空白と、後ろに何らかの文字列を入れた ?> |
エラーメッセージ
Parse error: syntax error, unexpected end of file, expecting variable (T_VARIABLE) or heredoc end (T_END_HEREDOC) or ${ (T_DOLLAR_OPEN_CURLY_BRACES) or {$ (T_CURLY_OPEN) in…
先ほどと同じエラーですね。
終端IDは先頭に記述し、IDの後ろは;
(セミコロン)と改行だけにしましょう。
インデントを入れてエラーになったという例もありますので、注意しましょう。
開始IDの後に文字列を入れてはいけない
開始IDの後に、改行以外の空白を含めた文字を入れるとエラーになります。
エラー構文
1 2 3 4 5 |
// 開始IDの後にコメントを入れてしまった echo <<<EOD // 開始ID ヒアドキュメントで、<br> テキスト出力も自由自在!! EOD; |
エラーメッセージ
Parse error: syntax error, unexpected ‘<<‘ (T_SL) in…
先ほどの2つとは多少違いますが、構文エラーとなります。
原則として、IDの後は改行しましょう。
その他に;
(セミコロン)を忘れるとPHPの閉じタグで閉じた場合を除きエラーになります。
ヒアドキュメントの色々な使い方
ヒアドキュメントを変数に格納
ヒアドキュメントを変数に格納すれば、いろんな箇所で使い回すこともできます。
1 2 3 4 5 6 7 8 9 10 11 |
<?php // ヒアドキュメント全体を変数に格納 $str = <<<EOD ヒアドキュメントで、<br> テキスト出力も自由自在!! EOD; // 変数を出力 echo $str; ?> |
ヒアドキュメントで、
テキスト出力も自由自在!!
ヒアドキュメント内で変数を使う
ヒアドキュメントは文字列だけでなく、変数を使うこともできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php // 都市名を変数に格納 $city = '横浜'; $str = <<<EOD こんにちは。<br> ここは $city 市です!<br> ごゆっくり{$city}を堪能ください! EOD; // (2行目)ここは $city 市です! ←半角スペースを空けて変数を記述 // (3行目)ごゆっくり{$city}を堪能ください! ←半角スペースを入れたくなければ { }(波カッコ)で変数を囲う echo $str; ?> |
こんにちは。
ここは 横浜 市です!
ごゆっくり横浜を堪能ください!
2行目のように半角スペースでも変数を使えますが、半角スペースが不自然ですね。
気になる方は、3行目の{}
(波カッコ)で変数を囲う方法なら、スペースで空ける必要もなく変数を使えます。
HTMLタグも一緒に記述
ヒアドキュメントは文字列だけでなく、HTMLタグなども出力できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php // HTMLを丸ごと変数に格納 $html = <<<EOD <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ドキュメント</title> </head> <body> <p>ヒアドキュメントで、<br> テキスト出力も自由自在!!</p> </body> </html> EOD; echo $html; ?> |
ソースの表示
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>ドキュメント</title>
</head>
<body>
<p>ヒアドキュメントで、<br>
テキスト出力も自由自在!!</p>
</body>
</html>
ブラウザのソースの表示を見ると、上記のようにHTMLタグも含めて出力されています。
メールフォームの定型文などを作る際も、ヒアドキュメントはよく使われますね。
Nowdocはシングルクォート版ヒアドキュメント(PHP5.3〜)
ヒアドキュメントは""
(ダブルクォート)で囲ったときと同じ動作になりますが、これを''
(シングルクォート)で囲ったときと同じバージョンが「Nowdoc」です。
PHP5.3より使えます。
1 2 3 4 5 6 7 8 9 10 11 |
$city = '横浜'; // 開始IDを' '(シングルクォート)で囲う $str = <<<'EOD' こんにちは。<br>\n ここは $city 市です! EOD; echo $str; ?> |
こんにちは。
\n ここは $city 市です!
Nowdocは開始IDを''
(シングルクォート)で囲うだけです。
シングルクォートなので、変数や改行文字がそのまま文字列で表示されました。
変数や\n
(改行文字)などの特殊文字は、シングルクォートではそのまま文字列として表示されます。
参考:引用符による処理の違い
あまり使うことはないですが、一応覚えておくと良いでしょう。
実はあまり使わないヒアドキュメント
ここまでヒアドキュメントについてご紹介しましたが、実はわたくしヒアドキュメントはあまり使いません。
HTMLに埋め込んで使うことも多いPHPですが、以下のように部分部分でPHPタグを使う記述法をよく使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title><?php echo $title; ?></title> </head> <body> <?php //PHPタグをHTMLタグで挟む; ?> <h1><?php echo $h1; ?></h1> <p><?php echo $text; ?></p> <ul> <li><?php echo $list1; ?></li> <li><?php echo $list2; ?></li> <li><?php echo $list3; ?></li> </ul> </body> </html> |
上記のように書けばHTMLにPHPを埋め込んでも、結構ソースもスッキリするなぁと思っています。
この辺は組織のルールや好みなどもあるでしょうが、わたくしはこういう記述法をオススメしています。
いずれにしても、引用符やエスケープを多用すると思わぬエラーの元にもなるため、活用していきたいですね。
終端ID前後だとインデントの自動字下げですら空白に含まれるんですね助かりました
杉山さん
意外な盲点ですよね。
わたくしも実はこの記事書く際にテストしたら、軽くハマってしまいました(笑)
杉山さんも問題が解決できたようで何よりです。
助かった