Что произошло, когда я использую multi ob_start() без ob_end_clean() или ob_end_flush()?

Я просмотрел руководство по php об ob_start() ob_end_clean() ob_end_flush(). И я видел другой пример по теме, так или иначе я изменил пример, но я в замешательстве в этот момент. вот script.

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;

И вывод этого script:

Здравствуйте, x, Здравствуйте, это OB_1: Привет, Галактика

, и это OB_2: Hello World

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

Почему вывод не такой?

это OB_1: Hello x, Hello y, Hello z, Galaxy

, и это OB_2: Hello World

И какой смысл я пропустил?

Ответ 1

Буферы вывода работают как стек. Вы создаете в нем один буфер и эхо "Hello x", затем вы создаете в нем еще один буфер и эхо "Hello y", затем вы создаете третий буфер и эхо "Hello z" в него. "Hello World" переходит в четвертый буфер, который закрывается вызовом ob_end_clean(), поэтому вы возвращаетесь к третьему. Когда вы вызываете ob_get_contents() после эха "Galaxy", вы получаете содержимое этого третьего буфера.

Если вы снова вызываете ob_get_contents() в конце этого кода, вы получите "Hello y", что во втором буфере. И если вы ob_end_close(), а затем ob_get_contents() снова, вы получите "Hello x" из первого буфера.

Ответ 2

Я буду комментировать ваш код, чтобы объяснить, что происходит. Все выходные буферы инициализируются пустым, что стандартно:

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.