2012-11-19 186 views
7

在PHP有時我看到這一點:PHP:<<< VS ob_start

$html = <<<HTML 
<p>Hello world</p> 
HTML; 

通常我會用ob_start():

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

你能告訴我,這兩者之間有什麼區別寫入緩衝區的方式及其優點?

+5

我想說,HEREDOCs顯然是更清潔。這也不是「寫入緩衝區的不同方法」。 HEREDOCs是*引用字符串*的一種方式。我敢說,'ob_'是一種可以在任何輸出消失之前捕捉到的輸出。 – deceze

+1

同意欺騙,大多數使用'ob_ *'函數指向糟糕的設計。然後HEREDOC再次在控制器或模型中尖叫「視圖層」。 –

+0

@MikeB它也尖叫「Heeey給我錢給另一位編碼員!」 –

回答

6

HEREDOC(<<<)是將字符串數據寫入變量的另一種方法。另一方面,輸出緩衝區將捕獲在ob_start()之後發生的所有輸出,包括(HTML)輸出在調用ob_get_contents()之前代碼中可能存在的任何警告或錯誤;

通常,如果您只需要使用HTML格式化字符串,只需使用HEREDOC或常規字符串表示法。如果您在發送任何HTTP標頭之前需要捕獲輸出,通常會使用輸出緩衝區(例如,如果您使用FirePHP來調試應用程序,則需要使用輸出緩衝,因爲FirePHP會將日誌記錄數據嵌入HTTP頭)。

+1

謝謝你們。我明白了這一點。 HEREDOCs適用於簡單的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使用輸出緩衝控制功能來管理內容和模塊。 Joomla就是一個例子。這種設計的優點是,無論何時模塊需要將內容放置到其保留空間時,它都可以簡單地使用echo來使內容可用。這可以簡化從模塊獲取內容的方式,無需實現特定的函數調用或分配給特定的變量,這使系統更易於管理。

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

我還利用輸出緩衝功能,這樣我可以包括在頂部一個文件,而不必在我可以創建一個簡單的模板系統到底有什麼PHP,但這是有點無關。

+0

謝謝你的解釋:-)真的內容豐富! – Jedi

+0

Joomla正在使用它?感謝您的信息 - 現在我真的知道使用outputbuffering在變量中存儲html是一個糟糕的設計:)(Joomla似乎太雜亂/糟糕的設計:)) –