在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();
你能告訴我,這兩者之間有什麼區別寫入緩衝區的方式及其優點?
在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();
你能告訴我,這兩者之間有什麼區別寫入緩衝區的方式及其優點?
HEREDOC(<<<
)是將字符串數據寫入變量的另一種方法。另一方面,輸出緩衝區將捕獲在ob_start()
之後發生的所有輸出,包括(HTML)輸出在調用ob_get_contents()
之前代碼中可能存在的任何警告或錯誤;
通常,如果您只需要使用HTML格式化字符串,只需使用HEREDOC或常規字符串表示法。如果您在發送任何HTTP標頭之前需要捕獲輸出,通常會使用輸出緩衝區(例如,如果您使用FirePHP來調試應用程序,則需要使用輸出緩衝,因爲FirePHP會將日誌記錄數據嵌入HTTP頭)。
謝謝你們。我明白了這一點。 HEREDOCs適用於簡單的HTML模板,而ob_start(),ob_get_contents()則可以抓取所有內容。 – Jedi
$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,但這是有點無關。
謝謝你的解釋:-)真的內容豐富! – Jedi
Joomla正在使用它?感謝您的信息 - 現在我真的知道使用outputbuffering在變量中存儲html是一個糟糕的設計:)(Joomla似乎太雜亂/糟糕的設計:)) –
我想說,HEREDOCs顯然是更清潔。這也不是「寫入緩衝區的不同方法」。 HEREDOCs是*引用字符串*的一種方式。我敢說,'ob_'是一種可以在任何輸出消失之前捕捉到的輸出。 – deceze
同意欺騙,大多數使用'ob_ *'函數指向糟糕的設計。然後HEREDOC再次在控制器或模型中尖叫「視圖層」。 –
@MikeB它也尖叫「Heeey給我錢給另一位編碼員!」 –