Befehl print - Texte am Bildschirm ausgeben

Damit die im PHP-Code vorgesehenen Inhalte am Bildschirm ausgegeben werden, benötigt man ein Ausgabebefehl. Neben echo gibt es in PHP den print-Befehl. Dieser funktioniert im Grunde genauso wie echo, es gibt jedoch einige Unterschiede. Es wird zu den Sprachkonstrukten gezählt und nicht zu den Funktionen. Das Verhalten ähnelt jedoch dem einer Funktion, da im Erfolgsfall der Rückgabewert 1 zurückgegeben wird. Der auszugebende Text wird in einfachen oder doppelten Anführungszeichen gesetzt. Im Gegensatz zu einer echten Funktion sind die runden Klammern links und rechts nur optional und können entfallen.

<?php

// Ohne Klammern
print 'Text';
print "Text";

// Mit Klammern
print ('Text');
print ("Text");

?>

Zeichenketten werden in einfachen oder doppelten Anführungszeichen gesetzt, damit der PHP-Interpreter diese als Zeichenketten betrachtet. Setzt man sie in einfachen Anführungszeichen, dann müssen diese bei einer Verwendung innerhalb der Zeichenkette mit \ (Backslash) maskiert werden, damit sie als Teil des Textes betrachtet werden. Würde man sie im Text ohne Maskierung verwenden, würde damit die Zeichenkette beendet werden und der restliche Teil würde zu einem Fehler führen. Alternativ dazu kann man Anführungszeichen auch als HTML-Entity angeben. Dasselbe gilt auch für doppelte Anführungszeichen.

<?php

// Funktioniert nicht
print "Text, der in "Anführungszeichen" steht";
print 'Hans' Auto';

?>
<?php

// Funktioniert
print 'Text, der in "Anführungszeichen" steht';
print "Hans' Auto";

// Funktioniert, da maskiert
print "Text, der in \"Anführungszeichen\" steht";
print 'Hans\' Auto';

// Funktioniert auch, da als HTML-Entity 
print "Text, der in &quot;Anführungszeichen&quot; steht";
print 'Hans&#039; Auto';

?>

Da man innerhalb von Zeichenketten eher doppelte Anführungszeichen verwendet, ist das Kennzeichnen der Zeichenkette mit einfachen Anführungszeichen zu favorisieren. Zu viele Maskierungen im Text machen diesen unleserlich.

<?php

// Zu favorisieren
print '<img src="bild.jpg">';

// Nicht zu favorisieren
print "<img src=\"bild.jpg\">";

?>

Ausgeben von Variablen

Bei der Ausgabe von Variablen dürfen diese nicht innerhalb von einfachen Anführungszeichen gesetzt werden, da damit nur der Variablenname ausgegeben werden würde und nicht der Inhalt.

<?php

$varname = 'Text';

// Ausgabe $varname
print '$varname';

// Ausgabe Text
print $varname;

?>

Hierbei gibt es Unterschiede zu doppelten Anführungszeichen. Bei Variablen, die man in Zeichenketten gesetzt hat, die mit doppelten Anführungszeichen gekennzeichnet wurden, werden die Inhalte ausgegeben und nicht der Variablenname.

<?php

$varname = 'Text';

// Ausgabe Text
print "$varname";

// Ausgabe Text mit einem Text in Zeichenkette
print "Text mit einem $varname in Zeichenkette";

?>

Bei dieser Variante entstehen automatisch Leerzeichen nach der Variable, da man diese vom übrigen Text abgrenzen muss. Beim folgenden Beispiel wurde $varname nicht vom übrigen Text abgegrenzt und das führt wiederum dazu, dass der PHP-Interpreter versucht, die Variable $varnamein auszugeben statt $varname.

<?php

$varname = ' Text ';

// Ausgabe Text mit einem Zeichenkette
print "Text mit einem$varnamein Zeichenkette";

?>

Falls nach der Variable kein Leerzeichen folgen soll, kann man sie gesondert in geschweifte Klammern setzen. So differenziert der PHP-Interpreter die Variable vom übrigen Text. Beim folgenden Beispiel würde die Variable richtig ausgegeben werden.

<?php

$varname = ' Text ';

// Ausgabe Text mit einem Text in Zeichenkette
print "Text mit einem{$varname}in Zeichenkette";

?>

Ausgeben von Konstanten und Arrays

Die Ausgabe von Konstanten und Arrays funktioniert genauso wie mit normalen Variablen. Allerdings muss man hierbei gewisse Dinge beachten, da die Handhabung unterschiedlich ist, je nachdem, ob das Array oder die Konstante in Anführungszeichen gesetzt wurde. Das kann dazu führen, dass vor allem assoziative Arrays mit Keys nicht wie gewünscht ausgegeben werden, zu denen auch die Superglobals wie $_GET, $_POST und $GLOBALS zählen. Nachfolgend ist ein Beispiel mit Arrays und Konstanten, wobei print ohne Anführungszeichen genutzt wird.

<?php

// Indiziertes Array
$tagin = array
(
  'Mo', 
  'Di', 
  'Mi'
);

// Funktioniert
print $tagin[0];


// Assoziatives Array
$tagas = array(
  'mo' => 'Mo', 
  'di' => 'Di', 
  'mi' => 'Mi'
);

// Funktioniert
print $tagas['mo'];


// Konstante
define('MWST', '0.19');

// Funktioniert
print MWST;

?>

Falls man die Zeichenkette nicht in doppelten Anführungszeichen setzt und die einfachen Anführungszeichen bei den Array-Keys auslässt, dann betrachtet der PHP-Interpreter den Key als Konstante und setzt den Wert der Konstante ein. Ist die angegebene Konstante jedoch nicht definiert, dann ist der Code eigentlich nicht richtig. Trotzdem funktioniert es, da der Key so behandelt wird, als wären die einfachen Anführungszeichen gesetzt worden und es wird ein Fehler der Stufe E_NOTICE ausgegeben.

<?php

// Assoziatives Array
$beitrag = array(
  'MWST' => '19', 
  'ZSUMME' => '100', 
  'SUMME' => '119'
);

// Konstante
define('MWST', 'SUMME');

// Funktioniert (19)
print $beitrag['MWST'];

// Nicht richtig, aber funktioniert mit E_NOTICE (100)
print $beitrag[ZSUMME];

// Setzt SUMME ein, da Wert von Konstante MWST (119)
print $beitrag[MWST];

?>

Ist das Array in einer Zeichenkette, wird der Key nicht als eine Konstante betrachtet, auch wenn er nicht in einfachen Anführungszeichen gesetzt wurde. Es tritt auch keine Fehlermeldung der Stufe E_NOTICE auf.

<?php

// Assoziatives Array
$beitrag = array(
  'MWST' => '19',
  'ZSUMME' => '100',
  'SUMME' => '100'
);

// Konstante
define('MWST', 'SUMME');

// Funktioniert (19)
print "Text mit $beitrag[MWST] drin";

?>

Das ist auch der Grund, warum die Angabe von assoziativen Arrays nicht funktioniert, wenn man die Keys in einfachen Anführungszeichen setzt. Beim folgenden Beispiel würde nichts ausgegeben werden.

<?php

// Assoziatives Array
$beitrag = array(
  'MWST' => '19',
  'ZSUMME' => '100',
  'SUMME' => '100'
);

// Konstante
define('MWST', 'SUMME');

// Funktioniert nicht
print "Text mit $beitrag['MWST'] drin";

$irgendwas = 'a';
// Funktioniert nicht
print "Text mit $GLOBALS['irgendwas'] drin";

// Funktioniert nicht
print "Text mit $_SERVER['DOCUMENT_ROOT'] drin";

?>

Eine Lösung hierbei ist, das Array innerhalb der geschweiften Klammern zu setzen. Dann gelten die Keys mit Anführungszeichen als Keys von Arrays und falls sie ohne Anführungszeichen angegeben wurden, als Konstanten.

<?php

// Assoziatives Array
$beitrag = array(
  'MWST' => '19', 
  'ZSUMME' => '100', 
  'SUMME' => '119'
);

// Konstante
define('MWST', 'SUMME');

// Funktioniert (19)
print "Text mit {$beitrag['MWST']} drin";

// Setzt SUMME ein, da Wert von Konstante MWST (119)
print "Text mit {$beitrag[MWST]} drin";

$irgendwas = 'a';
// Würde funktionieren
print "Text mit {$GLOBALS['irgendwas']} drin";

// Würde funktionieren
print "Text mit {$_SERVER['DOCUMENT_ROOT']} drin";

?>

print mit der Heredoc-Syntax verwenden

Es gibt eine sogenannte Heredoc-Syntax, mit der man Zeichenketten und Inhalte von Variablen ausgeben kann, ohne dass man einfache oder doppelte Anführungszeichen maskieren muss. Insbesondere bei langen und gemischten Texten steigert das die Lesbarkeit des Codes. Dabei wird der Inhalt in einem beliebigen Bezeichner eingefügt, den man mit <<< einleitet und mit einem Semikolon abschließt. Am Ende muss man beachten, dass zwischen dem Zeilenanfang und dem Bezeichner keine weiteren Zeichen, Leerzeichen, Tabulatoren etc. vorkommen.

<?php

$varname = 'Text';

print <<<BEZ
Beliebiger Text, der auch $varname enthalten 
und über mehrere Zeilen gehen kann. Man kann
auch Texte in 'einfachen' oder "doppelten"
Anführungszeichen setzen.
BEZ;

?>

Verwenden des Rückgabewerts

Genau betrachtet ist print keine reine Ausgabeanweisung wie der echo-Befehl, sondern ein Ausdruck (expression) mit einer Ausgabeanweisung. Ein Ausdruck liefert einen Wert zurück, der ausgewertet werden kann und das ist bei echo nicht der Fall. Mit echo wird lediglich eine Ausgabe durchgeführt.

Bei print wird jedoch die Ausgabe durchgeführt und je nachdem ob es erfolgreich war eine 0 oder 1 (falls erfolgreich) zurückgeliefert und das kann ausgewertet werden. Somit kann man print immer dann nutzen, wenn ein Ausdruck erwartet wird. Beispielsweise wird bei der Bedingungsprüfung der if-, else-Abfrage ein Ausdruck benötigt, damit die Programmausführung abhängig vom Wahrheitswert (TRUE oder FALSE) durchgeführt wird. An dieser Stelle kann man print einsetzen, echo jedoch nicht.

<?php

$a = 'a';
$b = $a;

if (($a == $b && print 'OK') || ($a != $b && print 'Fehler'))
{
  // Beliebiger Code
}
else
{
  // Beliebiger Code
}

?>

Auch bei der Verwendung des ternären Operators wird ein Ausdruck benötigt, sodass man beim folgenden Code print nicht durch echo ersetzen könnte. Der ternäre Operator ist eine Kurzform der if-, else-Abfrage.

<?php

$a = 'a';
$b = $a;

$a == $b ? print 'OK' : print 'Fehler';

?>

In der Praxis hat sich echo weitestgehend durchgesetzt, da ein Rückgabewert in Verbindung mit einer Ausgabe kaum benötigt wird. Außerdem ist es mit print nicht möglich, mehrere Parameter anzugeben.