2013-02-10 3 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_end_flush()를 호출했는지 확인하십시오. 여러 개의 출력 콜백 함수가 활성화 된 경우 출력은 순차적으로 각각 을 통해 필터링됩니다.

그래서 일치 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> 
를 반환/ ob_end/get이 끝날 것이라고 가정하는 완벽 유효
1

모든 정직한면에서 나는 어떤 문제도 보이지 않습니다. ob_start()에 대한 모든 호출은 ob_get_clean() 호출과 일치하므로 이러한 함수의 사용은 "부모"ob_start()에 완전히 투명합니다. ob_start()와 ob_get_clean()의 호출 쌍이 일치하지 않으면 끔찍한 습관이 될 수 있습니다. 그러나 그렇게하는 한 문제가 발생하지 않아야합니다. ob_start() 매뉴얼에서