2012-05-04 12 views
11

Ho revisionato il manuale php relativo a ob_start() ob_end_clean() ob_end_flush(). E ho visto un esempio diverso sull'argomento, comunque ho modificato l'esempio ma a questo punto sono confuso. ecco la sceneggiatura.cosa succede quando uso multi ob_start() senza ob_end_clean() o ob_end_flush()?

ob_start(); 
echo "Hello x, "; 

ob_start(); 
echo "Hello y, "; 

ob_start(); 
echo "Hello z, "; 

ob_start(); 
echo "Hello World"; 
$ob_2 = ob_get_contents(); 
ob_end_clean(); 

echo "Galaxy"; 
$ob_1 = ob_get_contents(); 
ob_end_clean(); 

echo " this is OB_1 : ".$ob_1; 
echo "<br> and this is OB_2 : ".$ob_2; 

E output di questo script è:

Ciao x, Ciao y, questo è OB_1: Ciao z, Galaxy

e questo è OB_2: Ciao Mondo

--------------------------------------------

Perché l'output non è così?

questo è OB_1: Ciao x, y Ciao, Ciao z, Galaxy

e questo è OB_2: Ciao Mondo

E qual è il punto che ho perso?

risposta

17

I buffer di uscita funzionano come una pila. Crei un buffer ed echo "Hello x", quindi crei un altro buffer ed echo "Hello y", quindi crei un terzo buffer ed echo "Hello z", in esso. Il "Hello World" entra in un quarto buffer, che viene chiuso dalla chiamata a ob_end_clean(), quindi si ritorna al terzo. Quando chiami ob_get_contents() dopo aver fatto eco a "Galaxy", ottieni il contenuto di quel terzo buffer.

Se si chiama ob_get_contents() nuovamente alla fine di questo codice, si otterrà il "Ciao y", che è nel secondo buffer. E se si ob_end_close() e quindi di nuovo ob_get_contents(), si otterrà "Hello x" dal primo buffer.

+2

Sto cercando di usare flush(), ob_flush(), ecc per un'ora, cercando di trovare fonti di utile. Sei il primo che * ha spiegato * cosa sta succedendo. +1 per una risposta semplice ma super utile. –

32

Annoterò il codice per spiegare cosa sta succedendo. Tutti i buffer di uscita vengono inizializzati ad essere vuoto, che è standard:

ob_start(); // open output buffer 1 
echo "Hello x, "; // echo appended to output buffer 1 

ob_start(); // open output buffer 2 
echo "Hello y, "; // echo appended output buffer 2 

ob_start(); // open output buffer 3 
echo "Hello z, "; // echo appended to output buffer 3 

ob_start(); // open output buffer 4 
echo "Hello World"; // echo appended output buffer 4 
$ob_2 = ob_get_contents(); // get contents of output buffer 4 
ob_end_clean(); // close and throw away contents of output buffer 4 

echo "Galaxy"; // echo appended to output buffer 3 
$ob_1 = ob_get_contents(); // get contents of output buffer 3 
ob_end_clean(); // close and throw away contents of output buffer 3 

// at this point, $ob_2 = "Hello World" and $ob_1 = "Hello z, Galaxy" 
// output buffer 1 = "Hello x," and output buffer 2 = "Hello y," 

echo " this is OB_1 : ".$ob_1; // echo appended to output buffer 2 

// output buffer 2 now looks like "Hello y, this is OB_1 : Hello z, Galaxy" 

echo "<br> and this is OB_2 : ".$ob_2; // echo appended to output buffer 2 

// output buffer 2 now looks like: 
// "Hello y, this is OB_1 : Hello z, Galaxy<br> and this is OB_2 : Hello World" 

// output buffer 2 implicitly flushed by end of script 
// output from buffer 2 captured by (appended to) output buffer 1 
// output buffer 1 now looks like: 
// "Hello x, Hello y, this is OB_1 : Hello z, Galaxy<br> and this is OB_2 : Hello World" 
// output buffer 1 implicitly closed by end of script. This is when your output 
// actually gets printed for this particular script. 
+1

grazie, così chiaro :) –

+1

mi dispiace, davvero mi sono dimenticato –

+1

questa è una grande spiegazione hehe. : D – gumuruh