为什么需要使用带有include()的ob_start()?

时间:2015-06-24 18:08:38

标签: php

当您需要包含其他PHP(或模板)文件时,为什么建议在PHP语言中使用ob_start()?

这很糟糕:

require_once( dirname( __DIR__ ) . '/views/file.php' );

这很好:

ob_start();
require_once( dirname( __DIR__ ) . '/views/file.php' );
$output = ob_get_clean();
return $output;

但我不明白为什么

3 个答案:

答案 0 :(得分:1)

没有这样的推荐,如果您认为有必要,请使用它。

ob_start()告诉PHP开始缓冲输出,任何方式的任何echo或其他输出都将被缓冲,而不是直接发送到客户端。

这可用于多种用途,其中一个即使在产生输出后也能够发送标题,因为缓冲还没有发送输出。

在这段特殊的代码中,您使用输出缓冲区来捕获包含文件生成的输出并将其存储到变量中,而不是将其发送到客户端。

答案 1 :(得分:1)

如果不了解您的计划,以及谁告诉您这样做,就很难说。首先,底部的返回$输出行 - 你从哪里返回?

我可以想到您希望以这种方式包含脚本的许多原因。

在PHP中,ob_ *函数处理输出缓冲,即捕获任何打印到PHP代码作为字符串运行的页面/屏幕的内容。

这可能是必要的,因为经典PHP中非常常见的模式是在任何<?php标记之外编写直接HTML。当您以这种方式输出文本时,它会直接发送到屏幕,绕过您可能想要使用的任何中间处理。程序员也可能希望在一个地方定义所有包含,以便可以轻松地将它们切换出来,然后在脚本中引用要作为变量输出的文本。

它也可能是一种阻止输出任何文本意外输出空白区域的方式,这使得以后无法在脚本中更改标题。我之前遇到过大型代码库,其中每个包含都被?>宗教关闭,之后可能会或可能不会包含空格。这可以用相对较少的努力解决问题。

在编程中,通常有许多不同的方法可以做到,而且并不总是其中一种方式是正确的。&#34;最终目标是创造一些能够完成其工作,可维护并且可以被其他程序员理解的东西。如果你为了追求可维护性而必须编写几行额外的代码,那么它就值得一试。

答案 2 :(得分:0)

ob_start()是一个以output buffering开始的函数,ob_get_clean();刷新缓冲区,看起来就是从函数返回它。

这允许将任何print or echo语句添加到缓冲区,然后将所有语句存储到变量中并返回并打印到应用程序的其他位置。