heredocとnowdocの違い、ちゃんと説明できますか
heredocとnowdocは複数行の文字列を書くための構文です。heredocは中の変数を展開し、nowdocは展開せず書いたそのままになる、という違いを持つ書き方です。
複数行の文字列を書くとき、ダブルクオートの中で改行やエスケープと格闘するより、heredocやnowdocを使ったほうが読みやすくなります。この2つ、見た目は似ていますが挙動が違います。
heredocは変数を展開する
$name = '田中';
$html = <<<HTML
<p>こんにちは、{$name}さん</p>
HTML;
開始は<<<識別子、終了は同じ識別子です。ダブルクオート文字列と同じく、中の変数が展開されます。変数は{$name}のように波括弧で囲むと、境界が明確になって安全です。
nowdocは展開しない
$template = <<<'TEXT'
金額は{$price}円です。
TEXT;
開始識別子をシングルクオートで囲むとnowdocになります。中身は一切展開されず、書いたそのままの文字列になります。{$price}もリテラルとして残ります。シングルクオート文字列の複数行版、というイメージです。
終了識別子のインデント(PHP 7.3以降)
PHP 7.3から終了識別子をインデントできるようになりました。終了行のインデント分が各行から取り除かれるので、コードブロックの中に埋め込んでも見た目が崩れません。
function render(): string
{
return <<<HTML
<div>
<p>本文</p>
</div>
HTML;
}
まとめ
変数を埋め込みたいならheredoc、テンプレートやコード片をそのまま持ちたいならnowdoc。SQLやHTMLの断片を書くときに重宝します。展開の有無を取り違えると{$var}がそのまま出力される事故になるので、そこだけ意識しておけば大丈夫です。
よくある質問
Q. heredocとnowdocの見分け方は。
A. 開始識別子をシングルクォートで囲むとnowdocです。heredocは変数を展開し、nowdocは展開せず書いたそのままになります。
Q. コードブロックの中でインデントすると余計な空白が入りませんか。
A. PHP 7.3以降は終了識別子のインデント分が各行から取り除かれるので、コード内に埋め込んでも見た目が崩れません。