Intereting Posts

что произошло, когда я использую 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, Привет, это OB_1: Привет, Галактика

и это OB_2: Hello World

——————————————–

Почему результат не такой?

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

и это OB_2: Hello World

И в чем я пропустил?

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

Если вы снова ob_get_contents() в конце этого кода, вы получите «Hello y», который находится во втором буфере. И если вы ob_end_close() , а затем ob_get_contents() снова, вы получите «Hello 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.