что произошло, когда я использовал multi ob start() без ob end clean() или ob end flush()?
Я просмотрел руководство по php для ob_start() ob_end_clean() 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;
И вывод этого скрипта:
Привет x, Привет y, это OB_1: Привет z, Галактика
А это OB_2: Привет, мир
--------------------------------------------
Почему вывод это не так?
Это OB_1: Привет x, Привет y, Привет z, Галактика
А это OB_2: Привет, мир
И какой смысл я упустил?
2 answers
Выходные буферы работают как стек. Вы создаете один буфер и повторяете в нем "Привет x", затем вы создаете другой буфер и повторяете в нем "Привет y", затем вы создаете третий буфер и повторяете в нем "Привет z". "Привет, мир" переходит в четвертый буфер, который закрывается вызовом ob_end_clean()
, так что вы возвращаетесь к третьему. Когда вы вызываете ob_get_contents()
после эха "Галактики", вы получаете содержимое этого третьего буфера.
Если вы снова вызовете ob_get_contents()
в конце этого кода, вы получите "Привет y", который находится во втором буфере. И если вы ob_end_close()
сделаете это, а затем ob_get_contents()
снова, вы получите "Привет x" из первого буфера.
Я запишу ваш код, чтобы объяснить, что происходит. Все выходные буферы инициализируются как пустые, что является стандартным:
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.