<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>