<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ------------------- 前置無關內容 -------------------</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"這是一些與文章內容無關的 PHP 輸出示例。\n"</span></span><span>;
</span><span><span class="hljs-variable">$time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d H:i:s"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"當前時間: <span class="hljs-subst">$time</span></span></span><span>\n";
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ------------------- 正文開始 -------------------</span></span><span>
<span class="hljs-comment">/**
* 標題: PHP 中 ob_get_contents() 與 ob_start() 多層嵌套怎麼用?實用技巧解析
*
* 在 PHP 中,輸出緩衝(Output Buffering)是一項非常有用的功能,它允許你在腳本執行過程中
* 捕獲輸出內容,而不是立即發送到瀏覽器。`ob_start()` 與 `ob_get_contents()` 是輸出緩衝
* 中最常用的函數。當你需要多層嵌套緩衝來控制不同部分的輸出時,理解它們的工作原理尤為重要。
*
* 1. ob_start() 的作用
* --------------------
* `ob_start()` 启动一个新的輸出緩衝区。之後的所有輸出(如 echo、print)都會被緩存到該緩衝區,
* 而不是直接輸出到瀏覽器。
*
* 示例:
*/</span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"這是第一層緩衝區的內容。"</span></span><span>;
</span><span><span class="hljs-variable">$content1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ob_get_contents</span></span><span>(); </span><span><span class="hljs-comment">// 獲取當前緩衝區內容</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>(); </span><span><span class="hljs-comment">// 輸出並結束緩衝區</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"\n獲取到的第一層緩衝區內容: <span class="hljs-subst">$content1</span></span></span><span>\n";
<span class="hljs-comment">/**
* 2. 多層嵌套緩衝
* ----------------
* 當需要多層嵌套時,可以多次調用 ob_start(),每次調用都會創建一個新的緩衝區,形成棧結構。
* 通過 ob_get_contents() 可以獲取當前緩衝區的內容,通過 ob_end_flush() 或 ob_end_clean()
* 可以結束當前緩衝區。
*
* 示例:
*/</span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 第一層緩衝</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"第一層開始\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>(); </span><span><span class="hljs-comment">// 第二層緩衝</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"第二層內容\n"</span></span><span>;
</span><span><span class="hljs-variable">$secondLayer</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ob_get_contents</span></span><span>(); </span><span><span class="hljs-comment">// 获取第二層內容</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_clean</span></span><span>(); </span><span><span class="hljs-comment">// 清空第二層緩衝(不會輸出)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"第一層繼續\n"</span></span><span>;
</span><span><span class="hljs-variable">$firstLayer</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ob_get_contents</span></span><span>(); </span><span><span class="hljs-comment">// 獲取第一層內容</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>(); </span><span><span class="hljs-comment">// 输出第一層緩衝区内容</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"\n第二層捕獲的內容: <span class="hljs-subst">$secondLayer</span></span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"第一層捕獲的內容: <span class="hljs-subst">$firstLayer</span></span></span><span>\n";
<span class="hljs-comment">/**
* 3. 實用技巧
* ------------
* - 延遲輸出:通過多层缓冲,你可以先處理內容,進行修改後再輸出。
* - 模板渲染:在渲染模板時,可以先緩衝輸出,進行變量替換或緩存後再輸出。
* - 日誌記錄:捕獲輸出內容到文件而不是直接输出。
*
* 注意事項:
* - 每次 ob_start() 都必須配合 ob_end_flush() 或 ob_end_clean()。
* - 嵌套層數過多可能增加內存開銷,建議根據實際需求使用。
*
* 4. 綜合示例
*/</span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"HTML 頁面頭部\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<p>主體內容</p>\n"</span></span><span>;
</span><span><span class="hljs-variable">$bodyContent</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ob_get_contents</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">ob_end_clean</span></span><span>(); </span><span><span class="hljs-comment">// 清空但不輸出</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<header>頭部</header>\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$bodyContent</span></span><span>; </span><span><span class="hljs-comment">// 再次输出主體內容</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>(); </span><span><span class="hljs-comment">// 輸出全部</span></span><span>
</span><span><span class="hljs-comment">// ------------------- 正文結束 -------------------</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ------------------- 尾部無關內容 -------------------</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文章結束示例:感謝閱讀!\n"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>