PHP echo und print: Text und Variablen ausgeben
Sie befinden sich:
Home >
Php >
PHP echo und print: Text und Variablen ausgeben
Frueher oder später will jeder PHP-Anfaenger etwas auf den Bildschirm bringen. Genau dafür gibt es echo und print. Beide klingen erst einmal wie das Gleiche, haben aber kleine Unterschiede in Syntax und Verhalten. Auf dieser Seite gehen wir den Klassiker echo ausführlich durch, schauen uns die Geschwister-Funktionen print, printf und die kurze Schreibweise <?= ?> an, klären wann doppelte und wann einfache Anführungszeichen Sinn ergeben und wie Sie Daten sicher in HTML einbettest. echo in einer MinuteMit echo geben Sie Text aus. Sie schreiben echo, dahinter den Wert oder einen Ausdruck und beendest die Zeile mit einem Semikolon. Hier ist das absolute Minimum: <?php
declare(strict_types=1);
echo 'Hallo PHP-Space';
Im Browser steht dann genau das, was zwischen den Anführungszeichen stand. echo ist kein Funktionsaufruf, sondern ein Sprachkonstrukt. Deshalb dürfen Sie Argumente sogar ohne Klammern übergeben. Welche Variante Sie wann nehmenEs gibt mehrere Wege, Text auf den Bildschirm zu bringen. Welcher davon der richtige ist, hängt vom Kontext ab. flowchart TD
A[Was willst du ausgeben?] --> B{Einfacher Text?}
B -- ja --> C[echo]
B -- formatiert --> D[printf / sprintf]
A --> E{In HTML-Template?}
E -- ja --> F[Kurzform <?= ?>]
A --> G{Mit User-Input?}
G -- ja --> H[htmlspecialchars]
echo nimmt mehrere ArgumenteIm Gegensatz zu print kann echo mehrere durch Komma getrennte Werte auf einmal ausgeben. Das ist oft schneller als die Werte mit Punkt zu verketten. <?php
$vorname = 'Mira';
$nachname = 'Beck';
/* Mehrere Argumente, durch Komma getrennt */
echo 'Hallo ', $vorname, ' ', $nachname, '!';
/* Klassische Verkettung mit Punkt */
echo 'Hallo ' . $vorname . ' ' . $nachname . '!';
Beide Schreibweisen liefern dasselbe Ergebnis. Die Komma-Variante hat den Vorteil, dass PHP die Strings nicht erst zusammenbauen muss, sondern sichekt nacheinander ausgibt. Doppelte und einfache AnführungszeichenDas ist ein Detail, das viele am Anfang verwirrt: PHP behandelt einfache und doppelte Anführungszeichen unterschiedlich. In doppelten Anführungszeichen werden Variablen automatisch ersetzen, in einfachen nicht. <?php
$name = 'Tom';
echo "Hallo, $name!"; /* Hallo, Tom! */
echo 'Hallo, $name!'; /* Hallo, $name! */
/* Bei komplexen Ausdruecken Klammern verwenden */
$daten = ['nutzer' => 'Lisa'];
echo "Hallo, {$daten['nutzer']}!"; /* Hallo, Lisa! */
Wenn Sie keine Variable einbauen wollen, wähl ruhig einfache Anführungszeichen. PHP muss dann nicht jeden String nach Variablen durchsuchen, was minimal schneller ist und Tippfehler wie versehentliche Variablen-Einsetzung verhindert. print: der kleine Bruder von echoNeben echo kennt PHP auch print. Beide tun fast das Gleiche, mit zwei Unterschieden: print nimmt nur ein Argument und gibt immer den Wert 1 zurueck. Dadurch können Sie print in Ausdruecken verwenden, etwa hinter dem or-Operator. <?php
print 'Mit print geht das auch';
print PHP_EOL;
/* Klassisches Beispiel: print im or-Pattern */
$datei = @fopen('config.ini', 'r') or print 'Konnte Datei nicht oeffnen';
Im Alltag nimmt aber praktisch jeder echo, weil es flexibler ist und mehrere Argumente schluckt. print begegnet sich vor allem in alten Codebasen. Die Kurzform <?= ?> im TemplateWer in einer HTML-Datei viel ausgibt, will nicht jedes Mal <?php echo ... ?> tippen. Dafür gibt es seit PHP 5.4 die Kurzform <?= ?>. Sie funktioniert auf jedem Server, weil sie unabhängig von short_open_tag immer aktiv ist. <?php
$titel = 'Willkommen';
$jahr = (int) date('Y');
?>
<!DOCTYPE html>
<html lang="de">
<head><title><?= htmlspecialchars($titel) ?></title></head>
<body>
<h1><?= htmlspecialchars($titel) ?></h1>
<p>Stand: <?= $jahr ?></p>
</body>
</html>
Diese Schreibweise haelt das Template lesbar, weil keine ablenkenden echo-Schluesselwoerter zwischen dem HTML stehen. Achten Sie aber darauf, in HTML-Templates immer htmlspecialchars() zu verwenden, sobald die Daten aus dem Formular oder einer Datenbank kommen. Sicher ausgeben mit htmlspecialchars()Sobald Sie Daten ausgeben, die nicht von sich selbst kommen (Formulare, URL-Parameter, Datenbank-Inhalte), müssen Sie sie durch htmlspecialchars() schicken. Sonst kann ein Angreifer per Cross-Site-Scripting JavaScript in Ihre Seite schmuggeln. <?php
declare(strict_types=1);
$nameRaw = $_POST['name'] ?? '';
/* Falsch: Schadcode landet 1:1 im Browser */
echo "Hallo, $nameRaw!";
/* Richtig: htmlspecialchars verhindert XSS */
echo 'Hallo, ' . htmlspecialchars($nameRaw, ENT_QUOTES, 'UTF-8') . '!';
Im Beispiel oben würde ein Eintrag wie <script>alert(1)</script> in der ersten Variante als JavaScript ausgeführt. In der zweiten Variante landet er als sichtbarer Text im Browser, ohne Schaden anzurichten. Mehr zu sicheren Eingaben finden Sie im Tutorial filter_var() und Eingabe filtern. Formatierte Ausgaben mit printf und sprintfWenn Sie Werte mit fester Anzahl Nachkommastellen, mit fuehrenden Nullen oder in einer bestimmten Tabellenform ausgeben wollen, hilft printf() oder sprintf(). printf() gibt sichekt aus, sprintf() liefert das Ergebnis als String zurueck. <?php
$preis = 19.5;
$menge = 7;
/* Direkt ausgeben */
printf('%2d Stueck zu je %.2f Euro = %.2f Euro' . PHP_EOL, $menge, $preis, $menge * $preis);
/* Ergibt: 7 Stueck zu je 19.50 Euro = 136.50 Euro */
/* Als String fuer spaetere Verwendung */
$zeile = sprintf('Datum: %04d-%02d-%02d', 2026, 5, 9);
echo $zeile;
/* Ergibt: Datum: 2026-05-09 */
Zeilenumbrueche verstehenIm Quelltext sieht \n wie ein Zeilenumbruch aus. Im Browser bleibt er aber unsichtbar, weil HTML keine Zeilenumbrueche aus dem Quelltext rendert. Dafür gibt es zwei Wege. <?php
echo 'Zeile 1' . PHP_EOL;
echo 'Zeile 2';
/* Im Browser-Quelltext nun zwei Zeilen, sichtbar bleibt es eine Zeile */
echo 'Zeile 1' . '<br>' . 'Zeile 2';
/* Im Browser sichtbar zwei Zeilen, dank <br> */
$mehrzeilig = "Zeile 1\nZeile 2\nZeile 3";
echo nl2br(htmlspecialchars($mehrzeilig));
/* nl2br setzt vor jeden \n ein <br>, fertig */
Die Funktion nl2br() ist praktisch, wenn der Text aus einer Datenbank kommt und der Nutzer dort echte Zeilenumbrueche eingegeben hat. Mehrzeilige Texte mit HeredocFür längere HTML-Bloecke gibt es Heredoc und Nowdoc. Heredoc verhält sich wie ein doppelt-anführungszeichen-String, ersetzen also Variablen. Nowdoc verhält sich wie einfache Anführungszeichen, lässt Variablen unangetastet. <?php
$name = 'Mira';
/* Heredoc: Variablen werden ersetzt */
echo <<<HTML
<article>
<h1>Hallo {$name}</h1>
<p>Schoen, dass du da bist.</p>
</article>
HTML;
/* Nowdoc: Variablen bleiben stehen */
echo <<<'TXT'
Roher Text mit $name als wortwoertlicher Inhalt.
TXT;
Mehr Details zur Heredoc- und Nowdoc-Syntax gibt es im Artikel Heredoc-Syntax und ihre Anwendung. Bedingte AusgabeHäufig wollen Sie nur unter bestimmten Bedingungen etwas ausgeben. Dafür kombinierst Sie echo mit der if-Anweisung oder dem Ternary-Operator. <?php
$alter = 19;
if ($alter >= 18) {
echo 'Du bist volljaehrig.';
} else {
echo 'Du bist minderjaehrig.';
}
/* Kompakter mit Ternary */
echo $alter >= 18 ? 'volljaehrig' : 'minderjaehrig';
/* Noch kompakter mit Match seit PHP 8.0 */
echo match (true) {
$alter < 14 => 'Kind',
$alter < 18 => 'Jugendlich',
default => 'Erwachsen',
};
Die match-Form ersetzen seit PHP 8 viele Stellen, an denen frueher switch stand. Sie ist kürzer und vergleicht streng (===). Was Sie nicht mehr verwenden solltestEine Schreibweise, die in alten Tutorials oft auftaucht, ist die Short-Tag-Variante <? echo ... ?>. Sie funktioniert nur, wenn der Server die short_open_tag-Option in der php.ini aktiviert hat. Auf vielen Hostern ist das nicht der Fall, Ihr Code würde dort einfach im Quelltext stehen statt ausgeführt zu werden. Bleib bei <?php und nutze für das Ausgeben die Kurzform <?= ?>, die immer aktiv ist. Häufige Fehler beim Ausgeben- Fehlendes Semikolon. Jede
echo-Anweisung muss mit ; enden, sonst gibt es einen Parse-Fehler. - Anführungszeichen vergessen. Wer einen String mit einfachem Anführungszeichen oeffnet und mit doppeltem schließen, bekommt einen Syntaxfehler.
- Variablen in einfachen Anführungszeichen. Dort werden sie NICHT ersetzen. Wer das nicht weiß, sucht oft lange nach dem Bug.
- echo statt return. Eine Funktion, die einen Wert zurueckgeben soll, sollte
return nutzen, nicht echo. Sonst lässt sich das Ergebnis nicht weiterverwenden. - Keine Trennung zwischen HTML und Daten. User-Input ohne
htmlspecialchars() ist eine offene Tür für XSS.
echo in Schleifen: Tabellen und Listen aufbauenDie typische Arbeit für echo sieht im echten Leben so aus: Ein Array kommt aus einer Datenbank, Sie gehen es mit foreach durch und bauen für jeden Eintrag ein Stück HTML zusammen. Hier ein typisches Beispiel mit einer Tabelle: <?php
declare(strict_types=1);
$benutzer = [
['name' => 'Mira', 'rolle' => 'Admin', 'aktiv' => true],
['name' => 'Lukas', 'rolle' => 'Editor', 'aktiv' => false],
['name' => 'Anna', 'rolle' => 'Leser', 'aktiv' => true],
];
echo '<table>';
echo '<thead><tr><th>Name</th><th>Rolle</th><th>Status</th></tr></thead>';
echo '<tbody>';
foreach ($benutzer as $u) {
echo '<tr>';
echo '<td>', htmlspecialchars($u['name']), '</td>';
echo '<td>', htmlspecialchars($u['rolle']), '</td>';
echo '<td>', $u['aktiv'] ? 'aktiv' : 'gesperrt', '</td>';
echo '</tr>';
}
echo '</tbody></table>';
Für kleine Tabellen ist das vollkommen in Ordnung. Bei größeren Templates greift man irgendwann zu einer Template-Engine wie Twig oder Blade, weil das Mischen von HTML und PHP-Echo schnell unuebersichtlich wird. Aber als Einstieg ist diese Schleifen-Variante das Brot-und-Butter-Werkzeug. Output Buffering: was ausgegeben wird, sammeln und steuernManchmal wollen Sie erst alle echo-Ausgaben einsammeln, bevor sie an den Browser gehen, etwa um sie in einer Variable zu speichern, sie zu komprimieren oder erst nach einer Bedingung zu schicken. Dafuer gibt es Output Buffering mit ob_start() und ob_get_clean(). <?php
declare(strict_types=1);
ob_start();
echo 'Diese Ausgabe geht nicht direkt an den Browser, ';
echo 'sie landet zuerst im Puffer.';
/* Inhalt aus dem Puffer in eine Variable holen und Puffer leeren */
$gepuffert = ob_get_clean();
echo '<p>Die Ausgabe ist:</p>';
echo '<blockquote>', htmlspecialchars($gepuffert), '</blockquote>';
Output Buffering hilft auch, wenn Sie schon HTML ausgegeben hast und danach noch einen header()-Aufruf brauchen, etwa für einen Resichect. Ohne Buffer würde PHP einen "Headers already sent"-Fehler ausspucken. Praxisbeispiel: Tageszeit-abhaengige BegruessungEine Begruessung, die sich nach der aktuellen Uhrzeit richtet, ist ein Klassiker für ein erstes Mini-Projekt. Sie brauchen nur eine Variable, die date()-Funktion und ein paar Vergleiche mit if: <?php
declare(strict_types=1);
$stunde = (int) date('H');
$name = $_GET['name'] ?? 'Gast';
if ($stunde < 5) {
$gruss = 'Schon wach';
} elseif ($stunde < 12) {
$gruss = 'Guten Morgen';
} elseif ($stunde < 18) {
$gruss = 'Guten Tag';
} elseif ($stunde < 22) {
$gruss = 'Guten Abend';
} else {
$gruss = 'Gute Nacht';
}
echo '<h1>', $gruss, ', ', htmlspecialchars($name), '!</h1>';
echo '<p>Es ist ', date('H:i'), ' Uhr.</p>';
Mit dieser Vorlage können Sie in zwei Minuten eine Webseite bauen, die jeden Besucher persoenlich anspricht. Wer mehrere Anwendungsfaelle in einem Schritt loesen will, schaut sich den match-Ausdruck an, der die if/elseif-Kette deutlich kompakter macht. Performance: echo, print oder Komma?Diese Frage taucht regelmäßig in Foren auf. Die Wahrheit: Bei einer normalen Webseite ist der Unterschied so klein, dass ihn kein Mensch merkt. Trotzdem hier die Reihenfolge, falls sich der theoretische Aspekt interessiert: - echo mit Komma (
echo $a, $b, $c;) ist meist am schnellsten, weil PHP keinen zwischengeschalteten String aufbaut. - echo mit Punkt (
echo $a . $b . $c;) muss erst alle Teile zusammenfuegen und dann ausgeben. - print mit Punkt ist eine Spur langsamer als
echo, weil print einen Rückgabewert produziert.
In der Praxis solltest Sie sich nicht von Performance-Mythen leiten lassen. Wichtiger ist, dass Ihr Code lesbar ist. Für eine sauber lesbare HTML-Vorlage sind die Kurzform <?= ?> oder Heredoc oft besser als ein riesiger Verkettungsausdruck mit lauter Punkten. Was geht mit Arrays und Objekten?Ein echo auf ein array sichekt funktioniert nicht. PHP weiß nicht, wie es das Array darstellen soll, und gibt nur die Warnung "Array to string conversion" aus. Für einen Schnellblick nutzen Sie stattdessen var_dump() oder print_r(): <?php
$daten = ['php' => '8.4', 'released' => 2024];
/* Falsch: gibt nur "Array" aus und triggert eine Warning */
echo $daten;
/* Richtig: print_r liefert eine lesbare Form */
print_r($daten);
/* Noch detaillierter mit var_dump */
var_dump($daten);
/* Im Echo-Kontext per implode */
echo implode(', ', $daten);
/* Oder als JSON, gut fuer JS-Schnittstellen */
echo json_encode($daten, JSON_PRETTY_PRINT);
Für die Ausgabe an einen Browser ist json_encode() oft die bessere Wahl, weil das Ergebnis von JavaScript sichekt als Datenstruktur gelesen werden kann. Bei Objekten kommt es darauf an, ob die Klasse die magische Methode __toString() definiert. Wenn ja, kann man das Objekt sichekt mit echo ausgeben, andernfalls bekommt man einen Fehler. Damals und heute: ein Beispiel im SichektvergleichAlte PHP-Tutorials zeigen oft Schreibweisen, die zwar funktionieren, aus heutiger Sicht aber Schwachstellen haben. Damit Sie erkennen, was sich seit den frühen 2000ern geändert hat, hier ein typisches Hallo-Welt-Skript in zwei Versionen mit konkreter Erklärung, was am modernen Code besser ist. Die alte Variante<?php
$test = "Das ist mein Text!";
echo $test;
?>
Funktioniert bis heute, hat aber drei kleine Schwächen: kein declare(strict_types=1), doppelte Anführungszeichen ohne Notwendigkeit (PHP sucht darin nach Variablen, was bei festem Text Verschwendung ist), und das schliessende ?> in einer reinen PHP-Datei kann später Header-Probleme verursachen. Die moderne Variante<?php
declare(strict_types=1);
$text = 'Das ist mein Text!';
echo $text;
Drei kleine Änderungen, drei klare Verbesserungen: declare(strict_types=1) aktiviert die strikte Typprüfung in dieser Datei, einfache Anführungszeichen sind eindeutig und schneller, das schliessende ?> ist weg. Mit Variablen und BerechnungDas gleiche Prinzip bei einem etwas längeren Beispiel: alt zeigt Verkettung mit Punkt und doppelte Anführungszeichen, neu nutzen Komma-Argumente von echo und sichere Formatierung. <?php
/* Alte Variante */
$vorname = "Max";
$nachname = "Mustermann";
echo "Name: " . $vorname . " " . $nachname;
<?php
declare(strict_types=1);
$vorname = 'Max';
$nachname = 'Mustermann';
/* Komma-Variante: PHP muss keine Strings zusammensetzen */
echo 'Name: ', $vorname, ' ', $nachname;
/* Wenn die Daten von ausserhalb kommen, immer escapen */
echo 'Name: ', htmlspecialchars($vorname), ' ', htmlspecialchars($nachname);
Damit haben Sie alle wichtigen Modernisierungen auf einen Blick: strikte Typen, einfache Anführungszeichen wo möglich, Komma-Argumente bei echo, und htmlspecialchars für alles, was nicht aus Ihrer eigenen Hand stammt. Wenn Sie das in Ihren Code-Reviews fest verankerst, hebst Sie sich von 90 Prozent der alten Tutorials ab. Vom ersten echo zum richtigen TemplateWer sicher mit echo umgehen kann, hat das halbe Frontend von PHP im Griff. Diese Themen bauen sinnvoll darauf auf: - Variablen festigen, sie sind die Inhalte, die Sie ausgeben.
- Mit der
if-Anweisung entscheiden, wann etwas ausgegeben wird. - Schleifen wie
foreach nutzen, um Listen aus Arrays auszugeben. - Eigene Funktionen schreiben, die Werte zurueckgeben, statt sichekt auszugeben.
- Mit printf und sprintf Werte sauber formatieren.
- Daten aus Formularen sicher anzeigen.
- Mit PDO und Prepared Statements Werte aus der Datenbank holen und ausgeben.
weiter zum nächsten Kapitel:
Heredoc -Syntax und dessen richtige Anwendung
|