2013-02-10 106 views
0

PHP中的輸出緩衝很有趣。它簡化了很多事情。我使用腳本頂部的ob_start()和底部的ob_get_clean()(或任何其他函數)。輸出緩衝,分層?

在這兩個調用之間可以再次調用這些函數,而不會干擾父調用。

這種類型的代碼是否有效? (它工作正常,但...)這是一個好習慣嗎?

<?php 

ob_start(); //NOTICE !!! 

echo '<p>echos of the top of the script</p>'; 
echo GetSomeOtherData(true); 
echo '<p>echos after GetSomeOtherData()</p>'; 

$data = ob_get_clean(); //NOTICE !!! 
echo $data; 

//just a function to return something, with the help of output buffering 
function GetSomeOtherData($toReturn) 
{ 

    ob_start();  //NOTICE !!! 
    echo '<p>This has been rendered inside a function</p>'; 
    $function_data = ob_get_clean(); //NOTICE !!! 

    if($toReturn===true) 
    { 
     return $function_data; 
    } 
    else 
    { 
     //may be an error | return something else 
     return '<p>An Error</p>'; 
    } 
} 
?> 

回答

1

ob_start()手冊:

輸出緩衝器是可堆疊的,即,可以調用ob_start(),而另一個 ob_start()是有效的。只要確保您撥打 ob_end_flush()適當的次數。如果多個輸出 回調函數處於活動狀態,則會按照嵌套順序通過它們中的每個順序過濾輸出 。

因此,它是完全有效的假設一個ob_end/get將結束/返回匹配ob_start例如爲:

ob_start(); 
    echo "<div class=outer>"; 
    ob_start(); 
    echo "<div class=inner></div>"; 
    $inner = ob_get_clean(); // <div class=inner></div> 
    echo "</div>"; 
$outer = ob_get_clean();  // <div class=outer></div> 
1

誠實地說,我沒有看到任何問題。每次調用ob_start()都會調用ob_get_clean(),所以這些函數的使用對「父」ob_start()是完全透明的。如果配對(對ob_start()和ob_get_clean())的調用不匹配,那將是一種可怕的習慣 - 但只要它們匹配,它就不會(也不會)給您帶來麻煩。