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其餘的函數還有不少,但只要能懂得這些機理應該也是不難懂的。附上其他函數