2012-05-04 4 views
11

Ich habe PHP-Handbuch über die ob_start() ob_end_clean() ob_end_flush() überprüft. Und ich habe ein anderes Beispiel über das Thema gesehen, jedenfalls habe ich das Beispiel geändert, aber ich bin an dieser Stelle verwirrt. Hier ist das Skript.Was passiert, wenn ich multi ob_start() ohne ob_end_clean() oder ob_end_flush() verwende?

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; 

Und Ausgabe dieses Skripts ist:

Hallo x, Hallo y, das ist OB_1: Hallo z, Galaxy

und das ist OB_2: Hallo Welt

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

Warum ist die Ausgabe nicht so?

dies OB_1: Hallo x, y Hallo, hallo z, Galaxy

und das ist OB_2: Hallo Welt

Und was ist der Punkt, den ich verpasst haben?

Antwort

17

Ausgabepuffer funktionieren wie ein Stapel. Du erstellst einen Puffer und gibst "Hello x" ein, dann erstellst du einen weiteren Puffer und gibst "Hallo y" ein, dann erstellst du einen dritten Puffer und gibst "Hallo z," hinein. Die "Hello World" geht in einen vierten Pufferspeicher, der durch den Aufruf von geschlossen wird, so dass du zurück zum dritten bist. Wenn Sie ob_get_contents() nach Echo "Galaxy" aufrufen, erhalten Sie den Inhalt dieses dritten Puffers.

Wenn Sie am Ende dieses Codes erneut ob_get_contents() aufrufen, erhalten Sie das "Hallo y", das ist im zweiten Puffer. Und wenn Sie wieder ob_end_close() und dann ob_get_contents(), erhalten Sie die "Hello x" aus dem ersten Puffer.

+2

Ich versuche, flush(), ob_flush() usw. für eine Stunde zu verwenden und versuche, hilfreiche Quellen zu finden. Du bist der Erste, der * erklärt * was vor sich geht. +1 für eine einfache, aber super hilfreiche Antwort. –

32

Ich werde Ihren Code kommentieren, um zu erklären, was vor sich geht. Alle Ausgangspuffer werden initialisiert, um leer zu sein, das ist 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

danke, so klar :) –

+1

sorry, wirklich habe ich vergessen –

+1

das ist eine großartige Erklärung hehe. : D – gumuruh