2012-11-19 3 views
7

때때로 나는이 볼

ob_start(); 
?> 
<p>Hello world</p> 
<?php 
$html = ob_get_contents(); 
ob_clean(); 

당신이이 둘 사이에 어떤 차이가 말해 줄 수 버퍼에 쓰는 방법과 장점?

+5

나는 HEREDOC이 분명히 훨씬 깨끗하다고 ​​말할 수 있습니다. 또한 "버퍼에 쓰는 다른 방법"이 아닙니다. HEREDOC은 * 문자열을 인용하는 방법입니다. 'ob_'은 내가 말하기를 감히 나가기 전에 출력을 포착 해킹하는 것입니다. – deceze

+1

deceze에 동의하면,'ob_ *'함수의 대부분은 잘못된 디자인을 가리킨다. 그런 다음 HEREDOC의 컨트롤러 나 모델에서 '레이어보기'를 외친다. –

+0

@MikeB 그것도 비명을 질렀다. "Heeey는 나에게 또 다른 코더에 돈을 줘!" –

답변

6

HEREDOC (<<<)은 문자열 데이터를 변수에 쓰는 또 다른 방법입니다. 출력 버퍼는 을 호출하기 전에 코드에있는 경고 또는 오류의 (HTML) 출력을 포함하여 ob_start() 이후에 발생하는 모든 출력을 catch합니다.

일반적으로 HTML 형식의 문자열 만 지정하면 HEREDOC 또는 일반 문자열 표기법을 사용하면됩니다. 출력 버퍼는 보통 HTTP 헤더를 보내기 전에 출력을 잡아야하는 경우에 사용됩니다 (예를 들어, 응용 프로그램을 디버그하기 위해 FirePHP을 사용하는 경우 FirePHP가 로깅 데이터를 HTTP에 포함하기 때문에 출력 버퍼링을 사용해야합니다 헤더).

+1

감사합니다. 나는 그 요지를 본다. HEREDOC는 간단한 HTML 템플릿에 유용하지만 ob_start(), ob_get_contents()는 그 사이의 모든 것을 잡아냅니다. – Jedi

8
$html = <<<HTML 
<p>Hello world</p> 
HTML; 
// equivalent: 
$html = "<p>Hello world</p>"; 

이것은 어떻게 든 다른 방법으로 일을 작은 따옴표와 큰 따옴표를 사용하는 것과 비슷 문자열을 작성하지만 탈출하는 구문이다는 PHP string Heredoc syntax을 사용합니다. {}을 사용하여 PHP 문자열을 직접 삽입 할 수 있습니다.


<?php 
ob_start(); 
?> 
<p>Hello world</p> 
<?php 
$html = ob_get_clean(); 

이 완전히 다른 것입니다. 그것은 PHP output buffering control을 사용하여 이 아닌을 PHP 코드 블록 안에 캡처합니다. 주어진 예에서와 마찬가지로 <p>Hello world</p>은 PHP 코드 블록 외부에 쓰여지며, 이는 클라이언트에 즉시 출력되어야합니다. 출력 버퍼링을 활성화하면 PHP의 버퍼 안에 저장되므로 나중에 ob_get_contents() 또는 ob_get_clean()을 사용하여 검색 할 수 있습니다. PHP 변수를 삽입해야하는 경우 <?=$blah?> 또는 <?php echo $blah?>을 사용해야합니다.


일부 CMS는 출력 버퍼링 제어 기능을 사용하여 내용과 모듈을 관리합니다. 한 가지 예가 줌라입니다. 이 디자인의 장점은 모듈이 예약 된 공간에 콘텐츠를 배치해야 할 때마다 echo을 사용하여 콘텐츠를 사용 가능하게 만들 수 있다는 것입니다. 이를 통해 특정 함수 호출을 구현하거나 특정 변수에 할당 할 필요없이 모듈에서 내용을 가져 오는 방법을 단순화 할 수 있으므로 시스템을보다 쉽게 ​​관리 할 수 ​​있습니다.

<?php 
ob_start(); 
include dirname(__FILE__)."/content.php"; 
$content = ob_get_clean(); 
output_document(array("body"=>$content)); 

나는 또한 상단에 하나 개의 파일을 포함 할 수 있도록, 그리고 간단한 템플릿 시스템을 만들 수 끝의 PHP를하지 않고 출력 버퍼링 기능을 활용하지만,이 일종의입니다 주제를 벗어.

+0

설명 주셔서 감사합니다 :-) 정말 유익한! – Jedi

+0

Joomla가 그것을 사용하고 계십니까? 정보 주셔서 감사합니다 - 지금은 정말 변수에 HTML을 저장하는 outputbuffering 사용 나쁜 디자인 :) (Joomla가 나쁘게 설계/나쁜 나를 위해 :) :)) –