Strings mit HEREDOC-Syntax definieren (Thema: PHP Beispiele)

Möglichkeiten der Definition von Strings in PHP über die HEREDOC-Syntax

1. Hinweis

Der nachfolgende Artikel stimmt größtenteils mit dem über die NOWDOC-Syntax überein. Wenn man letzteren schon gelesen hat, reicht es, diesen hier grob zu überfliegen.

2. Einleitung

HEREDOC ist eine spezielle Syntax in PHP zum Markieren von längeren, häufig mehrzeiligen, Textabschnitten. Sie werden durch „<<<MARKIERUNG” eingeleitet, wobei „MARKIERUNG” ein beliebiger String sein kann. In der Regel wird er zur Verbesserung der Übersichtlichkeit groß geschrieben. Auf „<<<MARKIERUNG” muss ein Zeilenumbruch und anschließend der Text folgen. Dieser kann genauso wie zwischen doppelten Anführungszeichen geschrieben werden. Variablen werden auch hier automatisch von PHP erkannt und durch ihre Werte ersetzt. Im Unterschied zu doppelten Anführungszeichen können allerdings auch innerhalb des Strings wiederum doppelte Anführungszeichen platziert werden, ohne dass diese escapet werden müssen. Das Ende des HEREDOC-Abschnitts wird mit „MARKIERUNG;” gekennzeichnet, welches am Anfang einer neuen Zeile stehen muss.

Neben der HEREDOC-Syntax gibt es auch die NOWDOC-Syntax, welche in einem eigenen Artikel erläutert wird. Während bei HEREDOC in den Strings Variablen geparset werden, ist dies bei NOWDOC nicht der Fall. HEREDOC gleicht also der String-Definition über doppelte Anführungszeichen, NOWDOC eher der über einfache Anführungszeichen.

3. Beispiel: Ein einfacher String in HEREDOC-Syntax

In diesem Beispiel wird $heredoc über die HEREDOC-Syntax als String mit Inhalt „abcdefg” definiert.

PHP-Code
<?php
	$heredoc = <<<STRING
abcdefg
STRING;
	var_dump($heredoc);
?>

HTML-Code: Ausgabe
string(7) "abcdefg" 

4. HEREDOC mit mehreren Zeilen

Ähnlich dem vorherigen Beispiel, diesmal geht der String aber über mehrere Zeilen.

PHP-Code
<?php
	$heredoc = <<<STRING
abcdefg
abcdefg
abcdefg
STRING;
	var_dump($heredoc);
?>

HTML-Code: Ausgabe
string(25) "abcdefg
abcdefg
abcdefg"


5. HEREDOC und Einrückungen

In diesem Beispiel werden Einrückungen über Tabs vorgenommen. Wie bei der Ausgabe zu sehen ist, werden diese mit übernommen. Will man dies vermeiden, dann darf man in HEREDOC keine Zeilen einrücken.

PHP-Code
<?php
	$heredoc = <<<STRING
		test
STRING;
	var_dump($heredoc);
?>

HTML-Code: Ausgabe
string(6) "		test"


6. HEREDOC mit anderen Start- und Endzeichen

Im nächsten Beispiel werden andere Bezeichnungen für die Start- und Endmarkierungen gewählt. Die Namensgebung erfolgt nach den selben Regeln wie bei Variablen: Klein- und Großbuchstaben, Zahlen und Unterstriche sind erlaubt. Der Name darf allerdings nicht mit einer Zahl beginnen.

PHP-Code
<?php
	$heredoc1 = <<<X
123456789
X;
	var_dump($heredoc1);
	
	$heredoc2 = <<<__bla__
test123
__bla__;
	var_dump($heredoc2);
	
	$heredoc3 = <<<a1234
Noch ein String.
a1234;
	var_dump($heredoc3);
?>

HTML-Code: Ausgabe
string(9) "123456789"
string(7) "test123"
string(16) "Noch ein String."


7. HEREDOC mit Startmarkierung in Anführungszeichen

Optional kann die Startmarkierung auch in doppelte Anführungszeichen gesetzt werden. Dadurch wird die Syntax von HEREDOC ähnlicher zu NOWDOC, da bei letzterer einfache Anführungszeichen Pflicht sind.

PHP-Code
<?php
	$heredoc = <<<"X"
asdasdasdasd
X;
	var_dump($heredoc);
?>

HTML-Code: Ausgabe
string(12) "asdasdasdasd"


8. Zugriff auf Variablen in HEREDOC

Innerhalb von HEREDOC werden Variablen automatisch durch ihre Werte ersetzt, so wie man es von der Stringdefinition bei doppelten Anführungszeichen her kennt.

PHP-Code
<?php
	$x = 10000;
	$heredoc = <<<STRING
Der Wert von x ist: $x
STRING;
	var_dump($heredoc);
?>

HTML-Code: Ausgabe
string(25) "Der Wert von x ist: 10000"


9. Verwenden von Anführungszeichen innerhalb des Textes

Seine Stärke spielt HEREDOC bei mehrzeiligen Texten, welche auch Anführungszeichen enthalten können, aus. Der Text ist insgesamt einfacher zu lesen als bei normaler Definition über einfache oder doppelte Anführungszeichen.

PHP-Code
<?php
	$heredoc = <<<STRING
Dies ist ein "Text", der auch 'Anführungszeichen' enthält,
was bei "normaler" Definition einige Schrägstriche/Backslashes zum
Escapen erfordern würde.
STRING;
	var_dump($heredoc);
?>

HTML-Code: Ausgabe
string(156) "Dies ist ein "Text", der auch 'Anführungszeichen' enthält,
was bei "normaler" Definition einige Schrägstriche/Backslashes zum
Escapen erfordern würde."


10. Die Start- und Endmarkierung darf im Text enthalten sein

Die Zeichen aus der Start- und Endmarkierung dürfen Teil des Textes sein. Auch eine Platzierung am Anfang einer Zeile ist erlaubt. In letzterem Fall muss allerdings auf die Zeichenkette mindestens ein weiteres Zeichen folgen, da es in HEREDOC prinzipiell nicht zwingend vorgeschrieben ist, den HEREDOC-Abschnitt mit einem Semikolon abzuschließen.

PHP-Code
<?php
	$heredoc = <<<X
Dieser Text enthält ein X.
X;
	var_dump($heredoc);
?>

HTML-Code: Ausgabe
string(27) "Dieser Text enthält ein X."


In neuer Zeile, ohne weiteres Zeichen (erzeugt einen Fehler):

PHP-Code
<?php
	$heredoc = <<<X
Dieser Text enthält ein X.
X
X;
	var_dump($heredoc);
?>

HTML-Code: Ausgabe
<br />
<b>Parse error</b>:  syntax error, unexpected T_STRING in <b>...\test.php</b> on line <b>5</b><br />


11. HEREDOC kann zu unschönem Code führen

Auf oberster bzw. globaler Ebene im Code ist die HEREDOC-Syntax zwar schön anzusehen, bei tieferer Verschachtelung aber kann sie zu unschönem Code führen, da der Text und die Endmarkierung am Anfang der Zeile stehen sollten bzw. müssen.

PHP-Code
<?php
	class MyClass {
		function doSomething($a) {
			if ($a === true) {
				$str = <<<HEREDOC
Dies ist ein beliebiger Text.
Sogar mit mehreren Zeilen!
(Und noch eine dritte Zeile.)
HEREDOC;
				echo $str;
			}
		}
	}
	$obj = new MyClass();
	$obj->doSomething(true);
?>

HTML-Code: Ausgabe
Dies ist ein beliebiger Text.
Sogar mit mehreren Zeilen!
(Und noch eine dritte Zeile.)

12. HEREDOC bei Feldern von Klassen und bei Klassen-Konstanten

Genauso wie zur Definition von „normalen” Variablen kann HEREDOC auch verwendet werden, um Felder und Konstanten einer Klasse zu setzen.

PHP-Code
<?php
class HeredocClass {
		public $v1 = <<<DOC
Test v1
DOC;
		public static $v2 = <<<DOC
Test v2
DOC;
		const v3 = <<<DOC
Test v3
DOC;
	}
	$obj = new HeredocClass();
	var_dump($obj->v1, $obj::$v2, $obj::v3);
?>

HTML-Code: Ausgabe
string(7) "Test v1"
string(7) "Test v2"
string(7) "Test v3"


13. HEREDOC als Parameter verwenden

Über HEREDOC definierte Strings müssen nicht zwangsweise Variablen zugewiesen werden. Stattdessen ist es auch möglich, sie direkt als Parameter zu verwenden. Nachfolgend wird dies dargestellt, indem an echo() ein über HEREDOC definierter String übergeben wird.

PHP-Code
<?php
	echo <<<HEREDOC_MIT_ECHO
Heredoc lässt sich problemlos mit echo
verknüpfen, sodass der Heredoc-String direkt
ausgegeben wird.
HEREDOC_MIT_ECHO;
?>

HTML-Code: Ausgabe
Heredoc lässt sich problemlos mit echo
verknüpfen, sodass der Heredoc-String direkt
ausgegeben wird.

In diesem zweiten Beispiel wird ein HEREDOC-String an var_dump übergeben, vergleichbar mit dem vorherigen Beispiel.

PHP-Code
<?php
	var_dump(<<<HEREDOC_MIT_VAR_DUMP
Heredoc mit var_dump
HEREDOC_MIT_VAR_DUMP
);
?>

HTML-Code: Ausgabe
string(21) "Heredoc mit var_dump"


14. Zeilenumbrüche vor dem Ende von HEREDOC

In diesem Beispiel wird analysiert, wie HEREDOC Zeilenumbrüche direkt vor der Endmarkierung behandelt. Dazu werden drei Zeilenumbrüche nach dem letzten Zeichen gesetzt. Wie zu sehen ist, wird der allerletzte Zeilenumbruch weggekürzt, die anderen beiden bleiben erhalten.

PHP-Code
<?php
$str = <<<HEREDOC
X


HEREDOC;
	var_dump($str);
?>

HTML-Code: Ausgabe
string(5) "X

"


15. Leerzeichen vor dem Ende von HEREDOC

Analog zum vorherigen Beispiel wird nun untersucht, wie HEREDOC Leerzeichen vor seinem Ende behandelt. Diesmal werden drei Leerzeichen vor dem letzten Zeilenumbruch (welcher zwangsweise gesetzt werden muss) platziert. Wie der Ausgabe entnommen werden kann, kürzt HEREDOC die Leerzeichen nicht weg.

PHP-Code
<?php
	$str = <<<HEREDOC
X   
HEREDOC;
	var_dump($str);
?>

HTML-Code: Ausgabe
string(4) "X   "


16. Die Markierung des Endes muss in einer neuen Zeile stehen

In diesem Beispiel wird testweise die Endmarkierung nicht an den Anfang einer neuen Zeile gesetzt. Das Ergebnis ist ein Parse Error. Die Endmarkierung muss also immer am Anfang einer Zeile stehen.

PHP-Code
<?php
	$str = <<<HEREDOC
X HEREDOC;
	var_dump($str);
?>

HTML-Code: Ausgabe
<br />
<b>Parse error</b>:  syntax error, unexpected $end in <b>...\test.php</b> on line <b>5</b><br />


17. HEREDOC mit Fehlerunterdrückung

Soll innerhalb des HEREDOC-Abschnitts auf Array-Schlüssel zugegriffen werden, die potenziell nicht definiert sind, dann können Warnungen durch Verwendung des @-Zeichens unterdrückt werden. Dieses muss direkt vor der Startmarkierung platziert werden („@<<<MARKIERUNG”). Dabei ist zu bedenken, dass dies unschöner Stil ist, da die Warnungen noch immer erzeugt werden. Durch das @-Zeichen werden sie nur nicht mehr dargestellt.

PHP-Code
<?php
	function printError($data) {
		echo @<<<ERR
Hallo {$data['username']},
es ist ein Fehler mit folgender Nachricht aufgetreten:
{$data['message']}
Ort des Fehlers: {$data['file']}, Zeile {$data['line']}.
ERR;
	}

	printError(array('message' => 'Ein Beispielproblem ist aufgetreten.', 'file'=>'index.php', 'line'=>127123));
?>

HTML-Code: Ausgabe
Hallo ,
es ist ein Fehler mit folgender Nachricht aufgetreten:
Ein Beispielproblem ist aufgetreten.
Ort des Fehlers: index.php, Zeile 127123.

Das selbe Beispiel ohne Fehlerunterdrückung (nur das @ fehlt):

PHP-Code
<?php
	function printError($data) {
		echo <<<ERR
Hallo {$data['username']},
es ist ein Fehler mit folgender Nachricht aufgetreten:
{$data['message']}
Ort des Fehlers: {$data['file']}, Zeile {$data['line']}.
ERR;
	}

	printError(array('message' => 'Ein Beispielproblem ist aufgetreten.', 'file'=>'index.php', 'line'=>127123));
?>

HTML-Code: Ausgabe
<br />
<b>Notice</b>:  Undefined index: username in <b>...\test.php</b> on line <b>4</b><br />
Hallo ,
es ist ein Fehler mit folgender Nachricht aufgetreten:
Ein Beispielproblem ist aufgetreten.
Ort des Fehlers: index.php, Zeile 127123.

Kommentare (0)

Von neu nach alt