ob_get_contents + ob_end_clean vs ob_get_clean

Lesezeit: 3 Minuten

Benutzer-Avatar
chiliNUSS

Gibt es einen Unterschied zwischen diesen beiden PHP-Teilen?

ob_start();
//code...
$pageContent = ob_get_contents();
ob_end_clean();
someFunction($pageContent);

vs

ob_start();
//code...
$pageContent=ob_get_clean();
someFunction($pageContent);

Ich verwende derzeit den ersten Block, würde aber gerne den zweiten verwenden, wenn er funktional gleichwertig ist, da er etwas prägnanter ist.

  • Es gibt einen PHP-Fehler, der dazu führt, dass sie anders funktionieren. Sie können meine Antwort einchecken.

    – Ryszard Jędraszyk

    28. Mai 2019 um 18:45 Uhr


Benutzer-Avatar
Amal Murali

Zur Beantwortung Ihrer Frage:

ob_get_clean() führt im Wesentlichen sowohl ob_get_contents() als auch ob_end_clean() aus.

Ja. Es ist funktional gleichwertig.


Fall 1:

ob_get_contents() + ob_end_clean():

ob_get_contents — Gibt den Inhalt des Ausgabepuffers zurück

ob_end_clean — Säubern (löschen) Sie den Ausgabepuffer und schalten Sie die Ausgabepufferung aus

Im Grunde speichern Sie also den Inhalt des Ausgabepuffers in einer Variablen und löschen ihn dann mit ob_end_clean().

Fall 2:

ob_get_clean — Holt den aktuellen Pufferinhalt und löscht den aktuellen Ausgabepuffer

Sie speichern den Pufferinhalt in einer Variablen und dann wird der Ausgabepuffer gelöscht.


Was Sie tun, ist im Wesentlichen dasselbe. Ich sehe also nichts Falsches darin, hier den zweiten Codeblock zu verwenden, da beide dasselbe tun.

  • Vielen Dank! Ich dachte, es sei dasselbe, nur um sicherzustellen, dass ich nicht versehentlich etwas Besonderes ändere, das hinter den Kulissen passiert.

    – chiliNUSS

    22. Juli 2013 um 20:42 Uhr

ob_get_contents() kann verwendet werden, um die Ausgangspufferung fortzusetzen.

Beispiel:

ob_start();
echo 'Something!';
$html1 = ob_get_contents();
echo 'More to say!';
$html2 = ob_get_contents();
ob_end_clean();

Am Ende haben die Vars diesen Inhalt:

$html1 = 'Something!';
$html2 = 'Something!More to say!';

Es gibt einen winzigen Unterschied zwischen

$stuff = ob_get_clean();

und

$stuff = ob_get_contents();
ob_end_clean();

das heißt, letzteres wird ein werfen E_NOTICE wenn zum Zeitpunkt des Aufrufs kein aktiver Ausgabepuffer vorhanden ist und ersterer nicht. Das Auslösen des Hinweises scheint mir tatsächlich das vernünftigere Verhalten zu sein, denn wenn Sie diese Funktionen ohne einen Ausgabepuffer aufrufen, machen Sie wahrscheinlich etwas falsch!

Dass die beiden Ansätze ziemlich gleichwertig sind, ist explizit auf php.net dokumentiertwas sagt:

ob_get_clean() führt im Wesentlichen beides aus ob_get_contents() und ob_end_clean().

Das warnende Verhalten von ob_end_clean ist auch dokumentiert:

Wenn die Funktion fehlschlägt, wird eine generiert E_NOTICE.

Beachten Sie, dass es in den Dokumenten von keinen ähnlichen Satz gibt ob_get_contents oder ob_end_clean.

Wenn Sie sich wirklich vergewissern möchten, dass es keine weiteren Unterschiede zwischen diesen Funktionen gibt (es gibt keine), können Sie in die Definitionen von eintauchen ob_get_contents, ob_end_clean und ob_get_clean in der Quelle. Es gibt eine seltsame Fehlerbehandlung für unmögliche Fälle in ob_get_clean das sollte nie erreicht werden, aber abgesehen davon können Sie sehen, dass die Verhaltensweisen wie beschrieben sind.

Benutzer-Avatar
Ryszard Jędraszyk

Basierend auf der Dokumentation,

ob_get_contents() + ob_end_clean()

soll genauso funktionieren wie:

ob_get_clean()

Aufgrund eines Fehlers in PHP ist dies jedoch nicht der Fall. Roland von nextendweb hat einen Fehlerbericht eingereicht:

https://bugs.php.net/bug.php?id=76563

Wenn Sie ob_start mit Callback verwenden, wird der Callback nicht ausgeführt, wenn Sie ob_get_clean() auf denselben Ausgabepuffer verwenden. Der Rückruf wird übersprungen, was zu unerwarteten Ergebnissen führt. Ich denke, es ist ein Fehler.

Also, wenn Sie einen Rückruf an übergeben ob_start()müssen Sie verwenden

$content = ob_get_contents();
ob_clean();

Anstatt von:

$content = ob_get_clean();

Beim Testen in der Sandbox werden Sie feststellen, dass alle PHP-Versionen davon betroffen sind.

1187650cookie-checkob_get_contents + ob_end_clean vs ob_get_clean

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy