Was ist der Vorteil der Verwendung von Heredoc in PHP? [geschlossen]


196

Was ist der Vorteil der Verwendung von Heredoc in PHP und können Sie ein Beispiel zeigen?


4
Es gibt keinen starken Grund, warum Alternativen besser sind als Heredocs
Shakti Singh

18
Ich habe dies so bearbeitet, dass es konstruktiver ist, und das Fragen-Community-Wiki erstellt, da es ziemlich subjektiv ist. Hinweis: Die Community schließt dies möglicherweise immer noch. Ich habe mich dafür entschieden, es offen zu lassen, da Sie qualitativ hochwertige Antworten erhalten.
Tim Post

9
Warum genau wird diese Frage nicht als konstruktiv angesehen?
Ambo100

Antworten:


218

Die Heredoc-Syntax ist für mich viel sauberer und sehr nützlich für mehrzeilige Zeichenfolgen und zur Vermeidung von Zitierproblemen. Früher habe ich sie verwendet, um SQL-Abfragen zu erstellen:

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

Für mich ist die Wahrscheinlichkeit, dass ein Syntaxfehler auftritt, geringer als bei der Verwendung von Anführungszeichen:

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

Ein weiterer Punkt ist, dass Sie vermeiden, doppelte Anführungszeichen in Ihrer Zeichenfolge zu vermeiden:

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

Das pProblem mit dem oben genannten ist der Syntaxfehler (das fehlende maskierte Anführungszeichen), den ich gerade eingeführt habe, im Gegensatz zur hier beschriebenen Dokumentensyntax:

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

Es ist ein bisschen Stil, aber ich verwende Folgendes als Regeln für einfache, doppelte und hier Dokumente zum Definieren von Zeichenfolgen:

  • Einfache Anführungszeichen werden verwendet, wenn die Zeichenfolge eine Konstante wie ist'no variables here'
  • Doppelte Anführungszeichen, wenn ich die Zeichenfolge in eine einzelne Zeile setzen kann und eine variable Interpolation oder ein eingebettetes einfaches Anführungszeichen benötige"Today is ${user}'s birthday"
  • Hier Dokumente für mehrzeilige Zeichenfolgen, die eine Formatierung und variable Interpolation erfordern.

40
Nitpick auf Ihr SQL-Beispiel: Sie sollten dort in erster Linie keine doppelten Anführungszeichen verwenden. Das funktioniert nur mit MySQL und nur, wenn dieser Server nicht im --ansikompatiblen Modus ausgeführt wird. SQL-Zeichenfolgen müssen einfache Anführungszeichen verwenden.
Mario

17
@mario Es war zur Veranschaulichung des Problems mit der Verwendung von doppelten Anführungszeichen im Allgemeinen nicht über die Besonderheiten der SQL
Wes

4
Um nicht zu sagen, dass das direkte Platzieren von Variablen in einer Abfrage eine schlechte, schlechte Art ist :-P
Ihr Menschenverstand

5
@Wes und @mario Dies ist ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
Programmpfade

11
"Um nicht zu sagen, dass das direkte Platzieren von Variablen in einer Abfrage eine schlechte, schlechte Art ist". Dies ist überhaupt nicht wahr. Das Einfügen nicht validierter Eingaben in SQL-Anweisungen ist "schlecht". Das Platzieren von Variablen in SQL-Anweisungen ist manchmal erforderlich.
Vogomatix

67

Heredocs sind aufgrund ihrer verbesserten Lesbarkeit und Wartbarkeit eine großartige Alternative zu zitierten Zeichenfolgen. Sie müssen sich keinen Anführungszeichen entziehen, und (gute) IDEs oder Texteditoren verwenden die richtige Syntaxhervorhebung.

Ein sehr häufiges Beispiel: HTML aus PHP wiedergeben:

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

// Sometime later
echo $html;

Es ist leicht zu lesen und leicht zu pflegen.

Die Alternative besteht darin, Zeichenfolgen in Anführungszeichen zu wiederholen, die maskierte Anführungszeichen enthalten, und IDEs werden die Syntax für diese Sprache nicht hervorheben, was zu einer schlechten Lesbarkeit und größeren Wartungsschwierigkeiten führt.

Aktualisierte Antwort für Ihren gesunden Menschenverstand

Natürlich möchten Sie nicht, dass eine SQL-Abfrage als HTML hervorgehoben wird. Um andere Sprachen zu verwenden, ändern Sie einfach die Sprache in der Syntax:

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

1
Kennen Sie zufällig die PHP-Funktion " Escape from PHP "?
Ihr

5
Das Entkommen aus PHP ist manchmal in Ordnung, aber wenn Sie eine Menge Dinge wiederholen und Ihre Syntax hervorhebt, müssen Sie mehr Zeichen eingeben, indem Sie einfach aus PHP entkommen, und PHP muss mehr Befehle ausführen als ein einzelnes Echo. Sie können auch eine Heredoc-Zeichenfolge auf eine Variable setzen und später wiedergeben. Wenn Sie PHP für Ihr HTML entkommen, wird es dann und dort ausgedruckt. Kann es nicht für später speichern.
Jake Wilson

2
1. Sie können die Ausgabepufferung verwenden, um die Ausgabe zu speichern. 2. Sie haben in Ihrem ersten Beispiel Echo verwendet. 3. (gute) IDEs oder Texteditoren unterbrechen NIEMALS die HTML-Hervorhebung, wenn Sie Escape aus PHP verwenden. 4. Welche IDE hebt die Syntax für HEREDOC hervor und welche Sprachregeln werden verwendet? Ist es in Ordnung, eine SQL-Abfrage als HTML-Text hervorzuheben?
Ihr gesunder Menschenverstand

1
Ein Heredoc ist eine PHP-Zeichenfolge. Natürlich können Sie keine Kontrollstrukturen in einem String verwenden. php.net/manual/en/language.types.string.php
Jake Wilson

11
Ich denke, Sie verstehen Heredocs falsch, nur für HTML-Zeichenfolgen zu gelten. Heredocs sind einfach eine alternative Möglichkeit, eine Zeichenfolge zu definieren, sei es HTML oder eine SQL-Abfrage oder alles, was Sie wollen. Sie sind einfacher zu schreiben und zu pflegen. Wes 'Antwort oben zeigt dies ganz offensichtlich (was, wenn Sie bemerken, die richtige Syntaxhervorhebung aufweist. Beschweren Sie sich nicht bei mir über das Versagen von NetBeans). Ich bin mir nicht sicher, warum Sie so sehr darauf aus sind, eine Antwort auf eine Community-Wiki-Frage herunterzustimmen ... Ob Sie es glauben oder nicht, die ursprünglichen PHP-Entwickler haben möglicherweise Heredocs in PHP aufgenommen, weil es in einigen Fällen tatsächlich nützlich sein könnte. .
Jake Wilson

8

Einige IDEs markieren den Code in Heredoc-Zeichenfolgen automatisch - was die Verwendung von Heredoc für XML oder HTML optisch ansprechend macht.

Ich persönlich mag es für längere Teile von zB XML, da ich mich nicht um Anführungszeichen kümmern muss und das XML einfach einfügen kann.


6

Zuallererst sind alle Gründe subjektiv. Es ist eher eine Geschmackssache als ein Grund.

Persönlich finde ich heredoc ziemlich nutzlos und benutze es gelegentlich, meistens, wenn ich HTML in eine Variable einfügen muss und mich nicht mit Ausgabepufferung beschäftigen möchte, um beispielsweise eine HTML-E-Mail-Nachricht zu erstellen.

Die Formatierung entspricht nicht den allgemeinen Einrückungsregeln, aber ich denke nicht, dass es eine große Sache ist.

       //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

Die Beispiele in der akzeptierten Antwort sind lediglich Betrug.
String-Beispiele sind in der Tat prägnanter, wenn man sie nicht betrügt

$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

Ich weiß nicht, ob ich sagen würde, Heredoc ist Faulheit. Man kann sagen, dass alles Faulheit ist, da es immer umständlichere Wege gibt, etwas zu tun.

In bestimmten Situationen möchten Sie beispielsweise möglicherweise Text mit eingebetteten Variablen ausgeben, ohne aus einer Datei abrufen und eine Vorlagenersetzung ausführen zu müssen. Mit Heredoc müssen Sie auf Anführungszeichen verzichten, sodass der angezeigte Text der von Ihnen ausgegebene Text ist. Natürlich gibt es einige Nachteile, zum Beispiel, dass Sie Ihren Heredoc nicht einrücken können, und das kann in bestimmten Situationen frustrierend sein, insbesondere wenn Sie ein Verfechter der einheitlichen Syntax sind, was ich bin.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.