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以降は終了識別子のインデント分が各行から取り除かれるので、コード内に埋め込んでも見た目が崩れません。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です