2013-02-10 2 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()) не совпадали - но до тех пор, пока они это делают, они не должны (и не будут) вызывать никаких проблем.

Смежные вопросы