web-dev-qa-db-ja.com

PHPでHeredocを使用する利点は何ですか?

PHPで Heredoc を使用する利点は何ですか?例を示すことができますか?

178
danidacar

ここでのdoc構文は私にとってはずっときれいで、複数行の文字列や引用の問題を回避するのに非常に役立ちます。昔、私はそれらを使用してSQLクエリを作成していました。

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

私にとって、これは引用符を使用するよりも構文エラーを引き起こす可能性が低いです:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";

もう1つのポイントは、文字列内の二重引用符のエスケープを回避することです。

$x = "The point of the \"argument" was to illustrate the use of here documents";

上記の問題は、構文エラー(エスケープされた引用符が欠落している)であるため、ここで説明した構文とは対照的に、先ほど紹介したとおりです。

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

スタイルは少しですが、文字列を定義するためのsingle、double、hereドキュメントのルールとして次を使用します。

  • シングル文字列が'no variables here'のような定数の場合、引用符が使用されます
  • Double単一行に文字列を配置でき、変数補間または埋め込み単一引用符を必要とする場合は引用符"Today is ${user}'s birthday"
  • ここフォーマットと変数補間が必要な複数行の文字列のドキュメント。
202
Wes

ヒアドキュメントは、可読性と保守性が向上しているため、引用文字列の優れた代替手段です。引用符をエスケープする必要はなく、(良い)IDEまたはテキストエディターは適切な構文強調表示を使用します。

非常に一般的な例:PHP内からHTMLをエコーアウトする:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// sometime later
echo $html;

読みやすい。メンテナンスが簡単。

別の方法は、引用符で囲まれた文字列をエコーすることです。これにはエスケープされた引用符が含まれ、IDEはその言語の構文を強調せず、読みにくくなり、メンテナンスが難しくなります。

あなたの常識の更新された答え

もちろん、SQLクエリをHTMLとしてハイライト表示したくないでしょう。他の言語を使用するには、構文の言語を変更するだけです。

$sql = <<<SQL
       SELECT * FROM table
SQL;
64
Jake Wilson

一部のIDEは、heredoc文字列のコードを自動的に強調表示します。これにより、XMLまたはHTMLにheredocを使用して視覚的に魅力的です。

私は引用文字の引用を気にする必要がなく、XMLを貼り付けるだけなので、個人的にはXMLの長い部分で気に入っています。

7
cweiske

まず第一に、すべての理由は主観的です。それは、理由というよりむしろ好みの問題のようです。

個人的には、ヒアドキュメントはまったく役に立たないと思いますが、たまに使用します。ほとんどの場合、HTMLを変数に入れる必要があり、たとえばHTMLメールメッセージを作成するために出力バッファリングに煩わ​​されたくない場合です。

書式設定は一般的なインデント規則に適合しませんが、大したことではないと思います。

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on

受け入れられた答えの例に関しては、それは単に不正行為です。
実際、文字列の例は、カンニングをしないとより簡潔になります

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';
5

ヒアドックが怠inessだと言うかどうかはわかりません。何かをするのはもっと面倒な方法があるので、何かをするのは怠lazだと言うことができます。

たとえば、特定の状況では、ファイルからフェッチしてテンプレート置換を実行することなく、変数が埋め込まれたテキストを出力することができます。 Heredocを使用すると、引用符をエスケープする必要がなくなるため、表示されるテキストは出力するテキストになります。明らかに、いくつかのネガがあります。たとえば、ヒアドキュメントをインデントできないため、特定の状況でイライラする可能性があります。特に、私が統一構文に固執している場合。

3
asnyder