Echo vs. Print

Es gibt viele Geheimnisse und Fehlinformationen über diesen grundlegenden Bereich von PHP. Jeder PHP-Entwickler lernt, wie man Text auf einer Seite erscheinen lässt. Normalerweise geschieht das mit Hilfe von echo. Später müssen sie herausfinden, was eigentlich in einer Variablen steht, und sie lernen/entdecken entweder print_r() oder var_dump().

Abends habe ich an einem Workshop teilgenommen, bei dem einige Aspekte von PHP für Leute, die die Sprache noch nicht kennen, vermittelt wurden. Diese Art von Workshops sind schwer zu geben, weil die Leute Fragen stellen, die nur Neulinge stellen würden, und oft geht es um Bereiche der Sprache, die von erfahrenen PHP-Entwicklern längst vergessen oder ignoriert wurden.

Einer der Teilnehmer fragte, was der Unterschied zwischen echo und print sei, und ich war mir sofort sicher, dass sie funktionieren. Dann dachte ich über die subtilen Unterschiede zwischen all den variablen Druckfunktionen nach, und dass sie nie wirklich im Detail erklärt werden. Das wollen wir ändern!

echo ist ein Sprachkonstrukt, das wie eine Funktion aussieht, es aber nicht ist. Laut der Dokumentation gibt es mehrere (String-)Parameter aus, doch wenn ich das versuche, erzeugt es einen Syntaxfehler:

php > echo("foo", "bar", "baz");
PHP Parse error: syntax error, unexpected ',' in php shell code on line 1

Die Klammern sind allerdings optional:

php > echo "foo"; echo("bar");
foobar

echo gibt keinen Wert zurück. Es hat nur die Aufgabe, eine Zeichenkette auszugeben.

Scheint, als hätte ich mehrere Zeichenketten ohne die Klammern ausprobieren sollen. Danke an diejenigen, die mich darauf hingewiesen haben. ☺

print

Im Gegensatz zu echo gibt die Dokumentation für print korrekt an, dass es eine einzelne Zeichenkette ausgibt. Es ist auch keine Funktion im eigentlichen Sinne, gibt aber seltsamerweise immer 1 zurück. Infolgedessen geschehen die folgenden Dinge:

php > print "foo"; print("bar"); print print print "baz";
foobarbaz11

Sonderbar. Definitiv seltsam.

print_r

Nach diesen praktisch ähnlichen Konstrukten beginnt print_r, die Idee der Ausgabe einer Variablen zu entwickeln. Die Idee hinter print_r ist es, eine menschenlesbare Darstellung einer einzelnen Variablen auszugeben/zurückzugeben:

php > print_r("foo"); print_r(2); print_r(true);
foo21

Der zweite (boolesche) Parameter von print_r sagt PHP, ob der Wert zurückgegeben oder ausgegeben werden soll. true bedeutet zurückgeben, false bedeutet ausgeben. Die Voreinstellung ist false.

php > echo print_r(, true);
Array
(
=> bar
)

print_r gibt eine Menge Informationen für tief verschachtelte Objekte zurück. Wenn es rekursive Referenzen entdeckt, lässt es diese aus und zeigt *RECURSION* an. Sie haben vielleicht auch bemerkt, dass Teile der Ausgabe von Leerzeichen umgeben sind, was die Lesbarkeit der Ausgabe erleichtert.

var_dump

Auch var_dump() gibt eine Darstellung einer oder mehrerer Variablen aus. Wie echo sagt auch die Dokumentation von var_dump(), dass es mehrere Variablen verarbeiten kann. Im Gegensatz zu echo scheint dies zuzutreffen:

php > var_dump("foo", "bar");
string(3) "foo"
string(3) "bar"php > var_dump(new StdClass);
class stdClass#1 (0) {
}

var_dump() zeigt auch verschachtelte Daten an, aber die Installation der XDebug-Erweiterung beschränkt dies auf drei Ebenen tief, und erfordert eine Konfigurationsänderung, um wieder mehr anzuzeigen.

Diese XDebug-Konfigurationsänderung, die Sie vornehmen müssen, lautet xdebug.var_display_max_depth=n.

var_dump() gibt keine zusätzlichen Leerzeichen aus, was es schwierig macht, die Ausgabe zu lesen. Außerdem verpackt die XDebug-Erweiterung alles in HTML-Elemente (zur Syntaxhervorhebung), so dass das Lesen der var_dump()-Ausgabe auf der Kommandozeile ein Alptraum ist.

var_export

var_export() ist ähnlich wie print_r(), da es direkt ausgeben oder einen String zurückgeben kann. Allerdings ist die Ausgabe/Rückgabe gültige PHP-Syntax:

php > var_export();
array (
'foo' => 'bar',
)

Sie werden nicht oft eine gute Verwendung für diese Methode finden, und wenn doch, dann werden Sie wahrscheinlich die Darstellung zurückgeben (anstatt sie auszugeben). Wenn man ihr eine Instanz übergibt, erhält man eine recht merkwürdige Darstellung:

php > $instance = new Thing();
php > $instance->foo = "bar";
php > var_export($instance);
Thing::__set_state(array(
'foo' => 'bar',
))

Wenn dieser Code geparst würde, würde die Methode __set_state() für die Klasse Thing aufgerufen werden. Hier ist ein Beispiel dafür, was man dann tun könnte:

class Thing
{
public $foo;
public static function __set_state($state)
{
$thing = new Thing();
$thing->foo = $state;
return $thing;
}
}

Man sollte auch beachten, dass Ressource-Variablen nicht exportiert werden können:

php > var_export(fopen("http://google.com", "r"));
NULL

Dies ist großartig, um ein sehr spezifisches Problem zu lösen; das Lesen, Aktualisieren und Schreiben von PHP-Konfigurationsdateien:

return ;

Dies ist von config.php

$config = file_get_contents("config.php");
$config = "world";
file_put_contents(
"config.php",
"return " . var_export($config, true) . ";"
);

Dies ist von update.php

return array (
'foo' => 'bar',
'hello' => 'world',
);

Dies ist von config.php

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.