ob_start() 和 ob_end_flush() 是一对很好的搭档,能够实现对输出的控制。当成一对出现理解起来就没什么问题,可是当他们两个各自出现次数增长时,就比较难理解了.php
<?php ob_start(); echo 'level 1<br/> '; ob_start(); echo 'level 2<br/> '; ob_start(); echo 'level 3<br/> '; ob_end_flush(); ob_end_flush(); ob_end_flush();
很明显,结果为:
level 1
level 2
level 3函数
当程序修改一下,修改一个ob_end_flush() 变成 ob_end_clean() 成为如下这个,你以为结果会是怎样呢?附上这几个函数的讲解:spa
<?php ob_start(); echo 'level 1<br/> '; ob_start(); echo 'level 2<br/> '; ob_start(); echo 'level 3<br/> '; ob_end_clean();//修改处 ob_end_flush(); ob_end_flush();
结果:
level 1
level 2.net
可能你会认为ob_end_clean()会清除与他最近的ob_start()的输出;其实这个说法不是很全面,看下面的例子code
<?php ob_start(); echo 'level 1<br/> '; ob_start(); echo 'level 2<br/> '; ob_start(); echo 'level 3<br/> '; ob_end_clean(); //第一次修改 ob_end_flush(); ob_end_clean(); //第二次修改
此次,什么都没有输出来。
中间不是有一个ob_flush()吗?按理来讲应该是输出 level2 的。orm
其实形成这样的主要缘由是输出的多级缓冲机制。这个程序例子有三个ob_start(),就意味着他有3个缓冲区A,B,C,而其实php程序自己也有一个最终输出的缓冲区,咱们就把他叫作F。ip
在这个程序中他这几个缓冲区是有必定层次的,C->B->A->F,F层次最高,是程序最终的输出缓冲,咱们按上面的程序来进行讲解。ci
刚开始。 F:null 字符串
ob_start();
新建缓冲区A。 A: null -> F:nullget
echo 'level 1<br/> ';
程序有输出,输出进入最低的缓冲区A A: 'level 1<br/>' -> F:null
ob_start();
新建缓冲区B 。 B:null -> A: 'level 1<br/>' -> F:null
echo 'level 2<br/> ';
程序有输出,输出进入最低的缓冲区B B:'level 2<br/> ' -> A: 'level 1<br/>' ->F:null
ob_start();
新建缓冲区C C:null B:'level 2<br/> ' A: 'level 1<br/>' -> F:null
echo 'level 3<br/> ';
程序有输出,输出进入最低的缓冲区C C:'level 3<br/> ' -> B:'level 2<br/> ' -> A: 'level 1<br/>' -> F:null
ob_end_clean(); //第一次修改
缓冲区C被清空并关闭。 B:'level 2<br/> ' -> A: 'level 1<br/>' -> F:null
ob_end_flush();
缓冲区B输出到上一级的缓冲区A并关闭。 A: 'level 1<br/>level 2<br/> ' -> F:null
ob_end_clean(); //第二次修改
缓冲区A被清空并关闭。 此时缓冲区A的东西还没真正输出到最终的F中,所以也就整个程序也就没有任何的输出了。
ob其余的函数还有不少,但只要能懂得这些机理应该也是不难懂的。附上其他函数