2012-11-19 41 views
7

In PHP manchmal sehe ich das:PHP: <<< vs ob_start

$html = <<<HTML 
<p>Hello world</p> 
HTML; 

Normalerweise würde ich ob_start verwendet haben():

ob_start(); 
?> 
<p>Hello world</p> 
<?php 
$html = ob_get_contents(); 
ob_clean(); 

Können Sie mir sagen, was der Unterschied zwischen diesen beiden Möglichkeiten zum Schreiben in den Puffer und ihre Vorteile?

+5

Ich würde sagen, dass HEREDOCs offensichtlich viel sauberer sind. Es ist auch nicht "verschiedene Möglichkeiten, in den Puffer zu schreiben". HEREDOCs sind eine Art, eine Zeichenkette * zu zitieren. 'ob_' ist ein, wage ich zu sagen, hack, um jede Ausgabe zu erfassen, bevor sie erlischt. – deceze

+1

Vereinbaren Sie mit deceze, die meisten Verwendung von 'ob_ *' Funktionen zeigen auf schlechtes Design. Dann noch einmal HEREDOCs 'View-Layer' in Controller oder Model. –

+0

@MikeB es schreit auch "Hey, gib mir Geld für einen anderen Programmierer!" –

Antwort

6

HEREDOC (<<<) ist nur eine andere Möglichkeit, eine Zeichenfolge in eine Variable zu schreiben. Der Ausgabepuffer fängt dagegen alle Ausgaben ab, die nach ob_start() stattfinden, einschließlich der (HTML-) Ausgabe von Warnungen oder Fehlern, die Sie möglicherweise im Code haben, bevor Sie ob_get_contents() aufrufen;

Wenn Sie nur eine Zeichenfolge mit HTML formatieren müssen, verwenden Sie einfach HEREDOC oder normale Zeichenfolgennotation. Ausgabepuffer werden normalerweise verwendet, wenn Sie die Ausgabe abfangen müssen, bevor Sie HTTP-Header senden (wenn Sie zum Beispiel FirePHP verwenden, um Ihre Anwendung zu debuggen, müssen Sie die Ausgabepufferung verwenden, da FirePHP die Protokolldaten in HTTP einbettet Kopfzeilen).

+1

Danke Jungs. Ich sehe den Punkt. HEREDOCs ist gut für einfache HTML-Templates, während ob_start(), ob_get_contents() alles dazwischen schnappt. – Jedi

8
$html = <<<HTML 
<p>Hello world</p> 
HTML; 
// equivalent: 
$html = "<p>Hello world</p>"; 

Dies verwendet die PHP string Heredoc syntax, die eine Syntax ist eine Zeichenfolge, ähnlich wie mit einfachen Anführungszeichen und doppelte Anführungszeichen, aber zu entkommen Dinge in einem irgendwie anders zu schreiben. Sie können {} verwenden, um einige PHP-Strings direkt einzufügen.


<?php 
ob_start(); 
?> 
<p>Hello world</p> 
<?php 
$html = ob_get_clean(); 

Dies ist eine ganz andere Sache. Es verwendet die PHP output buffering control, um Dinge zu erfassen, die nicht innerhalb PHP-Codeblöcke sind. Wie im Beispiel wird <p>Hello world</p> außerhalb des PHP-Codeblocks geschrieben, der sofort an den Client ausgegeben werden soll. Bei aktivierter Ausgabepufferung werden sie in PHP in einem Puffer gespeichert, so dass sie später unter Verwendung von ob_get_contents() oder ob_get_clean() abgerufen werden können. Wenn Sie PHP-Variablen einfügen müssen, müssen Sie <?=$blah?> oder sogar <?php echo $blah?> verwenden.


Einige CMS verwenden die Ausgabepuffersteuerungsfunktionen zum Verwalten von Inhalten und Modulen. Ein Beispiel ist Joomla. Der Vorteil dieses Designs besteht darin, dass das Modul immer dann, wenn das Modul Inhalte in seinem reservierten Bereich platzieren muss, echo verwenden kann, um den Inhalt verfügbar zu machen. Dies kann den Weg vereinfachen, Inhalte von den Modulen zu erhalten, ohne dass ein spezifischer Funktionsaufruf implementiert oder einer bestimmten Variablen zugewiesen werden muss, wodurch das System leichter zu verwalten ist.

<?php 
ob_start(); 
include dirname(__FILE__)."/content.php"; 
$content = ob_get_clean(); 
output_document(array("body"=>$content)); 

ich auch die Verwendung von Ausgabepufferung Funktionen, wie, dass ich eine Datei auf der Oberseite enthalten kann, und ohne am Ende jeden PHP mit mir einem einfachen Template-System erstellen kann, aber dies ist eine Art Off-Thema.

+0

Vielen Dank für Ihre Erklärung :-) Wirklich informativ! – Jedi

+0

Joomla benutzt es? Danke für die Info - jetzt weiß ich wirklich, dass die Verwendung von outputbuffering zum Speichern von HTML in Variable ein schlechtes Design ist :) (Joomla scheint zu chaotisch/schlecht für mich entworfen :)) –