Eigentlich ist es guter Stil, dass Funktionen/Methoden ihre Ergebnisse per return zurückgeben und dann das „übergeordnete” Programm entscheidet, wann diese gesendet werden. Häufig trifft man allerdings noch immer auf Funktionen oder Methoden, die stattdessen ihre Ergebnisse direkt per echo() an den Besucher senden. Das verringert die Flexibilität und verhindert zum Beispiel, dass die Ergebnisse nachbearbeitet werden (etwa mit einem regulären Ausdruck). Sehr häufig entsteht dadurch auch der headers already sent-Fehler (echo() bewirkt, dass die Header-Daten gesendet werden — danach darf man dann keine weiteren Header mehr senden und daher auch keine Cookies mehr ändern). Mit Hilfe von ob_start(), ob_get_contents() und ob_end_clean() lassen sich derartige Nerv-Funktionen bändigen indem ihre Ausgaben kurzerhand abgefangen werden.
Die drei Funktionen bewirken im einzelnen:
Beispiel:
Hinweis: Die ob_* Funktionen lassen sich beliebig verschachteln. Hat man ob_start() also bereits aufgerufen (zum Beispiel um die Komprimierung per gzip zu aktivieren), dann kann man den vorherigen Code trotzdem bedenkenlos verwenden.
Die drei Funktionen bewirken im einzelnen:
- ob_start(): Startet das „Abfangen” bzw. Aufzeichnen. Nachfolgende Ausgaben per echo() werden gespeichert und nicht gesendet.
- ob_enc_clean(): Gibt alle aufgezeichneten Ausgaben als String zurück.
- ob_end(): Beendet das Abfangen/Aufzeichnen.
Beispiel:
PHP-Code
<?php echo("(1) Das wird sofort gesendet\n"); // Abfangen starten ob_start(); // Das wird abgefangen echo("(2) Das wird nicht sofort gesendet.\n"); // Aufzeichnungen abspeichern $content = ob_get_contents(); // Abfangen beenden ob_end_clean(); // Etwas anderes senden echo("(3) Das wird jetzt als zweites gesendet.\n"); // erst jetzt wird der abgefangene Inhalt gesendet echo($content); ?>
Ausgabe
(1) Das wird sofort gesendet (3) Das wird jetzt als zweites gesendet. (2) Das wird nicht sofort gesendet.
Hinweis: Die ob_* Funktionen lassen sich beliebig verschachteln. Hat man ob_start() also bereits aufgerufen (zum Beispiel um die Komprimierung per gzip zu aktivieren), dann kann man den vorherigen Code trotzdem bedenkenlos verwenden.