Что произошло, когда я использую 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.