2012-11-19 13 views
7

In PHP a volte vedo questo:PHP: <<< vs ob_start

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

Normalmente avrei usato ob_start():

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

Potete dirmi qual è la differenza tra questi due modi per scrivere sul buffer e i loro vantaggi?

+5

Direi che gli EREDOC sono ovviamente molto più puliti. Non è anche "diversi modi di scrivere sul buffer". Gli HEREDOC sono un modo per * riportare una stringa *. 'ob_' è un, oserei dire, hackerare per catturare qualsiasi output prima che si spenga. – deceze

+1

D'accordo con l'inganno, la maggior parte delle funzioni 'ob_ *' indicano un cattivo design. Poi di nuovo HEREDOC urla 'view layer' nel controller o nel modello. –

+0

@MikeB urla anche "Heeey dammi i soldi per un altro programmatore!" –

risposta

6

HEREDOC (<<<) è solo un altro modo per scrivere una stringa di dati in una variabile. Il buffer di output, d'altra parte, catturerà tutto l'output che si verifica dopo ob_start() incluso l'output (HTML) di eventuali avvisi o errori che potrebbero essere presenti nel codice prima di chiamare ob_get_contents();

In genere, se è necessario formattare una stringa con HTML, è sufficiente utilizzare HEREDOC o la notazione di stringhe regolare. Il buffer di output viene solitamente utilizzato se è necessario catturare l'output prima di inviare qualsiasi intestazione HTTP (ad esempio, se si utilizza FirePHP per eseguire il debug dell'applicazione, sarà necessario utilizzare il buffer di output perché FirePHP incorpora i dati di registrazione nell'HTTP header).

+1

Grazie ragazzi. Vedo il punto. HEREDOCs è utile per i modelli HTML semplici, mentre ob_start(), ob_get_contents() cattura tutto ciò che c'è nel mezzo. – Jedi

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

Questo utilizza la PHP string Heredoc syntax, che è una sintassi di scrivere una stringa, simile ad usare le virgolette singole e doppie virgolette, ma sfuggire le cose in un modo in qualche modo diverso. È possibile utilizzare {} per inserire direttamente alcune stringhe PHP in esso.


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

Questa è una cosa totalmente diversa. Utilizza lo PHP output buffering control per acquisire elementi che sono non all'interno di blocchi di codice PHP. Come nell'esempio fornito, <p>Hello world</p> è scritto al di fuori del blocco di codice PHP, che dovrebbe essere immediatamente inviato al client. Con il buffer di output abilitato vengono memorizzati in un buffer in PHP, in modo che possa essere recuperato in un secondo momento utilizzando ob_get_contents() o ob_get_clean(). Se è necessario inserire variabili PHP, è necessario utilizzare <?=$blah?> o anche <?php echo $blah?>.


Alcuni CMS utilizzano le funzioni di controllo del buffer di uscita per gestire contenuti e moduli. Un esempio è Joomla. Il vantaggio di questo design è che ogni volta che il modulo deve posizionare il contenuto nel suo spazio riservato, può semplicemente usare echo per rendere il contenuto disponibile. Ciò può semplificare il modo di ottenere contenuti dai moduli, senza dover implementare una specifica chiamata di funzione o assegnare a una variabile specifica, il che rende più facile la gestione del sistema.

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

Ho anche fare uso delle funzioni di uscita di buffering in modo tale che posso includere un file in alto, e senza avere alcuna PHP alla fine riesco a creare un semplice modello di sistema, ma questo è una sorta di fuori tema.

+0

Grazie per la spiegazione :-) Davvero informativo! – Jedi

+0

Joomla lo sta usando? Grazie per le informazioni - ora so davvero che usare outputbuffering per la memorizzazione di html in variabili è un cattivo design :) (Joomla sembra troppo disordinato/pessimo progettato per me :)) –