Menu

PHP Heredoc und Nowdoc: mehrzeilige Strings

Ein PHP-Heredoc ist ein mehrzeiliger String, der mit <<<EOT beginnt und mit EOT endet; er ersetzt Variablen wie ein String in doppelten Anführungszeichen. Ein Nowdoc, <<<'EOT', behält den Text genau so, wie er geschrieben ist. Hier: Syntax, Einrückungsregeln, Interpolation von Arrays und Objekten und HTML-Templates.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Ein Heredoc ist ein mehrzeiliger String. Beginne ihn mit <<<EOT, schreib den Text in die folgenden Zeilen und beende ihn mit EOT; in einer eigenen Zeile. Variablen darin werden wie in einem String in doppelten Anführungszeichen ersetzt.

Der Bezeichner (hier EOT) ist ein Buchstabe oder Unterstrich, gefolgt von Buchstaben, Ziffern oder Unterstrichen. Üblich sind Namen, die sagen, was der Text ist: HTML, SQL, TEXT. Manche Editoren, darunter PhpStorm, heben den Inhalt in dieser Sprache hervor, wenn der Name HTML oder SQL lautet.

Ein HTML-Template mit Heredoc bauen

Heredoc ist der übersichtlichste Weg, einen Block HTML mit Werten darin zu schreiben, weil das Markup seine Form behält und nichts escapt werden muss. Die Ausgabe ist HTML, deshalb zeigt der Editor sie im Tab Page.

Zwei Details in diesem Block: Das Array-Element steht in geschweiften Klammern, {$product['name']}, und das wörtliche Dollarzeichen vor dem Preis ist als \$ escapt. Ändere den Namen oder füge ein Tag hinzu und führe den Code erneut aus.

Werte von Nutzern müssen escapt werden, bevor sie ins HTML kommen. Warum und wie, steht unter htmlspecialchars.

Nowdoc: Text ohne Interpolation

Ein Nowdoc setzt den Bezeichner in einfache Anführungszeichen: <<<'EOT'. Darin wird nichts ersetzt, Dollarzeichen und Backslashes bleiben also, wie sie sind. Verwende es für Codebeispiele, reguläre Ausdrücke und jeden Text, der $ enthält.

Die Endmarke einrücken

Seit PHP 7.3 darf die Endmarke eingerückt sein, und diese Einrückung wird von jeder Zeile des Inhalts entfernt. So kann ein Heredoc in einer Funktion oder einem if der Einrückung des Codes folgen, ohne dass die Leerzeichen im String landen.

Die Zeile mit json_encode macht das Ergebnis Zeichen für Zeichen sichtbar: Von jeder Zeile wurden 8 Leerzeichen entfernt, weil das schließende TEXT; um 8 eingerückt ist.

Eine Zeile des Inhalts, die weniger eingerückt ist als die Endmarke, ist ein Parse-Fehler:

$html = <<<HTML
  <p>Hello</p>
    HTML;
PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3

Arrays, Objekte und Methodenaufrufe im Heredoc

Heredoc folgt denselben Regeln wie doppelte Anführungszeichen. Einfache Variablen funktionieren allein; für Array-Schlüssel in Anführungszeichen, verschachtelte Arrays, Eigenschaften und Methodenaufrufe verwendest du geschweifte Klammern.

Heredoc als Funktionsargument

Seit PHP 7.3 darf nach der Endmarke in derselben Zeile weiterer Code folgen, also kannst du einen Heredoc direkt an eine Funktion übergeben oder in ein Array setzen. Mit sprintf bekommst du ein Template, dessen Platzhalter später gefüllt werden.

Typischer Fehler: fehlendes Semikolon oder zusätzlicher Text nach der Marke

Der schließende Bezeichner muss genau so geschrieben werden, wie er geöffnet wurde (gleiche Groß- und Kleinschreibung), und was danach in dieser Zeile folgt, muss als PHP Sinn ergeben. EOT; beendet eine Anweisung, EOT, setzt eine Argumentliste fort. Ein Buchstabe oder eine Ziffer direkt nach der Marke (EOTX;) versteckt sie, sodass der String bis zum Dateiende läuft und PHP syntax error, unexpected end of file meldet. Die umgekehrte Falle ist eine Zeile im Inhalt, die mit dem Bezeichner gefolgt von einem Leerzeichen oder Satzzeichen beginnt, etwa EOT is the marker: Sie beendet den String zu früh, und der Rest der Zeile wird als PHP gelesen (syntax error, unexpected identifier "is"). Wähle einen Bezeichner, der im Text nie am Zeilenanfang steht, etwa HTML für Markup oder SQL für eine Abfrage.

Häufig gestellte Fragen

Was ist ein Heredoc in PHP?

Eine Möglichkeit, einen mehrzeiligen String ohne Anführungszeichen zu schreiben: Beginne mit <<<EOT und einem Zeilenumbruch, schreib den Text und beende ihn mit EOT; in einer eigenen Zeile. Variablen darin werden ersetzt, genau wie in einem String in doppelten Anführungszeichen, und du kannst " und ' frei verwenden.

Was ist der Unterschied zwischen Heredoc und Nowdoc?

Ein Heredoc (<<<EOT) ersetzt Variablen und Escape-Sequenzen wie ein String in doppelten Anführungszeichen. Ein Nowdoc (<<<'EOT', Bezeichner in einfachen Anführungszeichen) macht beides nicht und behält jedes $ und jeden Backslash so, wie es geschrieben ist, wie ein String in einfachen Anführungszeichen.

Darf die schließende Heredoc-Marke eingerückt sein?

Ja, seit PHP 7.3. Die Einrückung der Endmarke wird von jeder Zeile des Inhalts entfernt, sodass du einen Heredoc passend zu deinem Code einrücken kannst. Jede Zeile des Inhalts muss mindestens so weit eingerückt sein wie die Endmarke, sonst stoppt PHP mit einem Parse-Fehler.

Wie rufe ich in einem Heredoc eine Funktion auf?

Heredoc interpoliert nur Variablen, Array-Elemente, Eigenschaften und Methodenaufrufe. Ruf die Funktion vorher auf und speichere das Ergebnis, oder leg den Funktionsnamen oder eine Closure in eine Variable und ruf sie in geschweiften Klammern auf: $e = 'htmlspecialchars'; und dann {$e($text)}.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S