14

这是我正在阅读的书中的示例代码:

ob_start();
include("{$path}.ini");
$string = ob_get_contents();
ob_end_clean();
$pairs = parse_ini_string($string);

我的问题是,如何ob_get_contents()知道从什么获取内容?(在这种情况下是 {$path}.ini)?

4

4 回答 4

14

ob_get_contents只需获取输出缓冲区的内容,因为您调用ob_start(). 本质上,PHP 中的输出缓冲区会捕获任何可能输出到浏览器的内容(不包括标题)。var_dump它在您可能需要过滤某些输出的情况下很有用,或者您正在使用将输出直接写入屏幕的 PHP 方法(例如),并且您希望该方法的返回值以字符串形式显示。

在这种情况下,因为您正在include()输入.ini文件,所以它的内容本质上将输出到屏幕,并且ob_get_contents()将获取文件的内容。

如果您要放在echo "I'm a little teapot short and stout";下方include,这也将包含在文件$string正文之后.ini

但是,在您的特定情况下,输出缓冲是不必要的开销,只需file_get_contents.ini文件上使用即可。我不确定为什么一本书甚至会包含此代码。

于 2013-02-03T11:31:26.047 回答
6

“ob”代表“输出缓冲区”。当您调用 时ob_start(),PHP 将所有输出(使用echo等)重新路由到输出缓冲区。然后您可以使用其他ob_*函数来检索和/或清除缓冲区内容。

在您的示例中,它将缓冲由"{$path}.ini". 当你包含它时,它的输出被添加到缓冲区中,当你调用它时ob_get_contents(),它检索缓冲区的内容。

于 2013-02-03T11:32:00.980 回答
3

来自 PHP:

ob_start — Turn on output buffering
ob_get_contents — Return the contents of the output buffer
ob_end_clean — Clean (erase) the output buffer and turn off output buffering

现在,ob_get_contents 可以收集所有输出的缓冲区。

[1] http://www.php.net/manual/en/book.outcontrol.php

于 2013-02-03T11:32:46.483 回答
2

ob_get_contents()正在获取调用ob_start()函数后回显的所有内容,因此没有什么特别之处{$path}.ini- 您需要回显要收集的数据(是的,甚至会收集简单echoprint_r调用的输出 - 有时对调试简单脚本很有用)。

您可以ob_start()将函数理解为从屏幕到(不可见)PHP 内部缓冲区的简单重定向,该缓冲区稍后会被ob_get_contents(). 因此,您将能够重定向您在屏幕上看到的任何内容,而无需调用ob_start()函数(甚至是整个网页)。

于 2013-02-03T11:34:37.853 回答