2012-05-04 1 views
11

J'ai passé en revue le manuel de php au sujet du ob_start() ob_end_clean() ob_end_flush(). Et j'ai vu un exemple différent sur le sujet, de toute façon j'ai modifié l'exemple mais je suis confus à ce point. voici le script.que s'est-il passé lorsque j'ai utilisé multi ob_start() sans ob_end_clean() ou 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; 

et la sortie de ce script est:

Bonjour x, Bonjour y, c'est OB_1: Bonjour z, Galaxy

et c'est OB_2: Bonjour tout le monde

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

Pourquoi la sortie n'est pas comme ça?

c'est OB_1: Bonjour x, Bonjour y, z Bonjour, Galaxy

et c'est OB_2: Bonjour tout le monde

Et quel est le point que j'ai manqué?

Répondre

17

Les tampons de sortie fonctionnent comme une pile. Vous créez un tampon et vous y écrivez "Hello x", puis vous créez un autre tampon et vous y écrivez "Hello y", puis vous créez un troisième tampon et vous y écrivez "Hello z". Le "Hello World" va dans un quatrième tampon, qui est fermé par l'appel à ob_end_clean(), de sorte que vous êtes de retour à la troisième. Lorsque vous appelez ob_get_contents() après avoir fait écho à "Galaxy", vous obtenez le contenu de ce troisième tampon.

Si vous appelez de nouveau ob_get_contents() à la fin de ce code, vous obtiendrez le "Hello y" qui se trouve dans le second tampon. Et si vous ob_end_close() cela encore et puis ob_get_contents(), vous obtiendrez le "Bonjour x", à partir du premier tampon.

+2

J'essaie d'utiliser flush(), ob_flush() etc. pendant une heure, en essayant de trouver des sources utiles. Vous êtes le premier à expliquer ce qui se passe. +1 pour une réponse simple mais super utile. –

32

Je vais annoter votre code pour expliquer ce qui se passe. Tous les tampons de sortie sont initialisés pour être vides, ce qui est 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

merci, si clair :) –

+1

désolé, vraiment j'ai oublié –

+1

c'est une grande explication hehe. :RÉ – gumuruh

Questions connexes