phpBuddy

Tipps & Tricks

PHP Profis von morgen finden hier diverse Tipps & Tricks zu immer wiederkehrende Hürden beim programmieren. Darüber hinaus werden auch weniger bekannte Funktionen anhand von kleinen Beispielen erklärt.

Sie sind hier: Startseite Quick Tip Index Heredoc und Nowdoc
Heredoc und Nowdoc

Zeichenketten mit HEREDOC und NOWDOC

Viele angehende PHP Programmierer kennen beim Umgang mit Zeichenketten, auch bekannt als Strings, meist nur die beiden Möglichkeiten diese mit Einfachen Anführungszeichen (Single Quotes) oder Doppelte Anführungszeichen (Double Quotes) zu umschließen. Bei längeren Textpassagen oder speziell bei einem größeren Abschnitt mit HTML, kommt es nicht selten zu regelrechten Escape-Orgien und unterbrochenen/verketteten Strings. Wer kennt nicht solche Konstrukte?!

$seite = "google.de";
$url = "<p>Hier geht's zu <a href=\"http://www." . $seite . "\" class=\"extern\">" . $seite . "</a></p>";

Bei einer Zeile ist das gerade noch vertretbar und durch geschicktes ändern der Quotes könnte man das zwar noch etwas übersichtlicher gestalten, aber wie unübersichtlich und fehleranfällig das wird, wenn man jetzt 5, 25 oder noch mehr solcher Zeilen hat, haben die meisten sicher selbst schon erlebt.

PHP bietet uns aber eine Möglichkeit lange Zeichenketten zu kapseln, diese mit Quotes und Variablen zu spicken und trotzdem sehr übersichtlich zu bleiben.


HEREDOC

Die HEREDOC Schreibweise unterliegt weitestgehend den gleichen Eigenschaften, als ob man Text in Double Quotes einbettet. Das bedeutet, dass Variablen geparsed werden. Steuerzeichen wie der Zeilenumbruch (\n), Tabulator (\t), usw. werden ausgeführt. Man kann aber ohne Probleme Anführungszeichen einsetzen und mischen, ohne ständig den Text unterbrechen zu müssen. Hier ein kleines Beispiel eines Textblocks, gekapselt in eine HEREDOC Syntax:

$beispieltext_a = <<<HEREDOC
<p>Die besten PHP Tutorials findet man auf {$url}!</p>
<p>HEREDOC verhält sich wie Text in <a href="http://www.phpbuddy.eu/anfuehrungszeichen-single-quotes-double-quotes.html">Double Quotes</a>
mit all seinen Eigenheiten. So erzeugt das Steuerzeichen \\n \n im Browser Quelltext einen Zeilenumbruch.</p>
<p>Einfache Anführungszeichen ' und Doppelte Anführungszeichen " müssen nicht mit einem \\ escaped werden.<br />
Der Backslash \\ ist das Escape-Zeichen und muss logischerweise selbst escaped werden um ihn darzustellen.</p>
<p>HEREDOC eignet sich auch um HTML und PHP Code zu mischen und den Quelltext übersichtlich zu halten. Beispiel:</p>
<ul>
    <li>{$liste[0]}</li>
    <li>{$liste[1]}</li>
    <li>{$liste[2]}</li>
</ul>
<p>Um das Parsen von Code zu verhindern, muss man ihn escapen: {\$url}</p>
HEREDOC;

Wir weisen also einen Textblock der Variablen $beispieltext_a zu. Wie deutlich zu sehen ist, wird der Text nirgends unterbrochen und auch Anführungszeichen werden nicht escaped. Was man bei der HEREDOC und NOWDOC Syntax genau beachten muss erkläre ich weiter unten in der Hinweis Box. Da die Regeln für beide Varianten identisch sind, erkläre ich das am Ende dieses Artikels.


NOWDOC

Das Gegenstück zu HEREDOC ist NOWDOC. Verhält sich Text in einem HEREDOC Abschnitt, als stehe er in Double Quotes, verhält sich Text in einem NOWDOC Abschnitt, als stehe er in Single Quotes.

Wichtiger Hinweis:
NOWDOC wurde erst mit PHP 5.3.0 eingeführt und steht somit in älteren PHP Versionen nicht zur Verfügung! HEREDOC ist in allen PHP 5 Versionen verfügbar

Die Syntax bei beiden Varianten ist identisch mit dem kleinen Unterschied, dass der Delimiter bei NOWDOC in einfache Anführungszeichen (Single Quotes) steht! Hier ein Beispiel:

$beispieltext_b = <<<'NOWDOC'
<p>NOWDOC verhält sich dagegen wie Text in Single Quotes. Variablen werden nicht geparst: {$url}</p>
<p>Selbst ganze PHP Code Blöcke werden nicht ausgeführt (Rechtsklick Quelltext anzeigen):</p>
<?php
echo 'Ich bin ein Beispieltext.';
?>
<ul>
    <li>{$liste[0]}</li>
    <li>{$liste[1]}</li>
    <li>{$liste[2]}</li>
</ul>
<p>Der Backslash \ hat im NOWDOC keine Bedeutung, weil es nichts zu escapen gibt.</p>
NOWDOC;

Sämtliche Variablen, Steuerzeichen, sogar ganze PHP Code Blöcke werden nicht ausgeführt.
Schauen wir uns nun mal die Regel für den Einsatz der *DOC Syntax an.


Wichtige Regel für den Einsatz von HEREDOC und NOWDOC

Wie oben mehrfach erwähnt, unterliegen die beiden *DOC Varianten den globalen Bestimungen im Umgang mit Strings. Welchen Unterschied und welchen Einfluss die Wahl der Anführungszeichen auf eine Zeichenkette hat kann im Tutorial Single Quotes oder Double Quotes nachgelesen werden.
Desweiteren sind folgende Regeln strikt einzuhalten, da es sonst zu Fehler im Script kommt:

  • *DOC Blöcke werden immer mit einer dreifachen Spitzklammer eingeleitet <<<
  • Unmittelbar auf die Klammern folgt der Delimiter, der frei gewählt werden kann. So funktioniert <<<ABC genauso wie <<<KAFFEETASSE oder <<<BRATWURST. Wichtig ist allerdings, dass das Wort das als Delimiter gewählt wurde nirgends im Textblock vorkommen darf!
  • Nach dem öffnenden Delimiter muss ein Zeilenumbruch stattfinden. Der Textblock beginnt also in der nachfolgenden Zeile.
  • Der schließende Delimiter muss in einer neuen Zeile stehen, er muss die ersten Zeichen der Zeile darstellen. Das bedeutet, dass man den schließenden Delimiter nicht einrücken darf. Selbst ein Leerzeichen vor dem Delimiter führt zu einem Fehler.
  • Nach dem schließenden Delimiter muss ein Semikolon folgen und es muss ein Zeilenumbruch auf das Semikolon folgen. Der Delimiter mit dem Semikolon darf also nicht das letzte Zeichen in einem Script sein! Ebenso darf kein anderes Whitespace (Leerzeichen, Tabulator, u.ä) nach dem Semikolon und vor dem Zeilenumbruch stehen.

Zum Abschluß noch der Hinweis auf die phpBuddy.eu Demo Seite - einen permanenten Link findet man auch auf der linken Seite im Menü Quicklinks. Auf der Demo Seite findet man die kompletten Listings und eine live Demo zu sämtlichen Quick Tips und diversen anderen Tutorials.


Bis zum nächsten Quick Tip,
phpBuddy


Eine live Demo und den vollständigen Code findest Du auf der phpBuddy.eu Demo Seite.