PHPでヒアドキュメントを使用する利点は何ですか?[閉まっている]


196

PHPでヒアドキュメントを使用する利点は何ですか?例を示すことができますか?


4
代替案がヒアドキュメントよりも優れているという明確な理由はありません
Shakti Singh

18
私はこれをより建設的になるように編集し、それはかなり主観的であるため、質問コミュニティwikiを作りました。注、コミュニティはまだこれを閉じている可能性があります。質の高い回答を得ているので、そのままにしておくことを選択しました。
Tim Post

9
なぜこの質問は建設的に考えられていないのですか?
Ambo100 2016

回答:


218

ヒアドキュメントの構文は私にはずっとすっきりしていて、複数行の文字列や引用の問題を回避するのにとても便利です。以前は、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";

上記のpProblemは、ここでのドキュメントの構文とは対照的に、先ほど紹介した構文エラー(エスケープされた引用符がない)です。

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

それは少しスタイルですが、文字列を定義するためのシングル、ダブル、ヒアドキュメントのルールとして次を使用します。

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

40
SQLの例のNitpick:そもそもその中で二重引用符を使用しないでください。これは、MySQLでのみ機能し、そのサーバーが--ansi準拠モードで実行されていない場合にのみ機能します。SQL文字列一重引用符を使用する必要があります。
マリオ2011

17
@marioこれは、SQLの詳細ではなく、一般的に二重引用符の使用に関する問題を説明するためのものでした
Wes

4
問合せに変数を配置することで直接悪い、悪いマナー:-Pがあると言っているわけではない
あなたの常識

5
@Wesおよび@marioこれはANSI SQLです:SELECT * FROM "order" WHERE "table"='1'
programaths

11
「変数をクエリに直接配置することは、悪い、悪いマナーだと言っているのではありません」。これはまったく真実ではありません。検証されていない入力をSQLステートメントに配置することは、「悪いマナー」です。SQLステートメント内に変数を配置する必要がある場合があります。
vogomatix

67

ヒアドキュメントは、可読性と保守性が向上しているため、引用文字列の優れた代替手段です。引用符をエスケープする必要はなく、(良い)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;

読みやすく、保守も簡単です。

もう1つの方法は、引用符で囲まれた文字列をエコーすることです。この文字列はエスケープされた引用符を含み、IDEはその言語の構文を強調表示しないため、読みやすさが低下し、メンテナンスが難しくなります。

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

もちろん、SQLクエリがHTMLとして強調表示されるのは望ましくありません。他の言語を使用するには、構文で言語を変更するだけです。

$sql = <<<SQL
       SELECT * FROM table
SQL;

1
PHPの「PHPからの脱出」機能を知っていますか?
常識

5
PHPからのエスケープは問題ない場合がありますが、多くのことをエコーし​​ている場合、構文の強調表示が壊れると、PHPから単純にエスケープするだけでより多くの文字を入力する必要があり、PHPには単一のエコーの代わりに実行するコマンドが多くなります。また、ヒアドキュメント文字列を変数に設定して、後でエコーすることもできます。PHPをHTMLにエスケープするとは、その場で印刷されることを意味します。後で保存することはできません。
Jake Wilson

2
1.出力バッファリングを使用して出力を保存できます。2.最初の例ではエコーを使用していました。3.(良い)IDEのまたはテキストエディタ決してあなたがPHPからの脱出を使用しているとき、HTMLハイライトを壊しません。4. HEREDOCの構文でハイライト表示されるIDEと使用される言語ルールは何ですか?SQLクエリがHTMLテキストとして強調表示されていても問題ありませんか?
常識

1
ヒアドキュメントはPHP文字列です。もちろん、文字列で制御構造を使用することはできません。php.net/manual/en/language.types.string.php
ジェイクウィルソン

11
ヒアドキュメントはHTMLの文字列にのみ適用されると誤解していると思います。ヒアドキュメントは、HTMLやSQLクエリなど、文字列を定義する別の方法です。上記のウェスの答えは、それを明らかに示しています(正しい構文の強調表示があることに注意してください。NetBeansの失敗について文句を言わないでください)。コミュニティウィキの質問への回答に反対票を投じるのが難しいと思われる理由はわかりません...信じられないかもしれませんが、元のPHP開発者は実際に役立つ場合があるため、PHPにHeredocを含めている可能性があります。 。
ジェイク・ウィルソン

8

一部のIDEは、ヒアドキュメント文字列のコードを自動的に強調表示します。これにより、XMLまたはHTMLでヒアドキュメントを視覚的に魅力的にすることができます。

引用文字の引用を気にする必要がなく、XMLを簡単に貼り付けることができるため、個人的にはXMLのより長い部分で気に入っています。


6

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

個人的には、ヒアドキュメントはまったく役に立たないことがあり、たまにそれを使用します。ほとんどの場合、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';

3

ヘレドックが怠惰だと言えるかどうかはわかりません。何かをするためのより面倒な方法が常にあるので、人は何でもすることは怠惰であると言うことができます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.