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

11

я рассмотрел руководство 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;

И вывод этого скрипта:

Hello x, Hello y, this is OB_1 : Hello z, Galaxy

and this is OB_2 : Hello World

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

Why the output isn't like that?

this is OB_1 : Hello x, Hello y, Hello z, Galaxy

and this is OB_2 : Hello World

And what is the point i have missed?

Ваш Ответ

2   ответа
33

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

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.
Error: User Rate Limit Exceeded Yunus Ekiz
Error: User Rate Limit Exceeded
17

Hello x," quot; в него, затем вы создаете другой буфер и выводите "Hello y" в него, затем вы создаете третий буфер и выводите «Hello z,» внутрь. & Quot; Привет, мир & quot; переходит в четвертый буфер, который закрывается вызовомob_end_clean()Итак, вы вернулись к третьему. Когда вы звонитеob_get_contents() после повторения «Галактики» вы получаете содержимое этого третьего буфера.

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

Error: User Rate Limit ExceededexplainedError: User Rate Limit Exceeded

Похожие вопросы