我已经在php中编程了许多年,并且在我的几个类和类方法中使用了输出缓冲。最近,在写模板课时,我的思绪开始漫游。以下是我的想法:
这只是一个例子。
class someClass {
protected $contents;
public function __construct() {
ob_start();
// execute some code here.
}
private function someMethod() {
// execute some code here.
$this->contents = ob_get_contents();
}
public function someOtherMethod() {
ob_end_clean();
echo $this->contents;
}
}
考虑上面的示例代码。
问题
答案 0 :(得分:1)
调试是最大的好处,特别是在响应ajax请求时(即,当你无法控制另一个端点时,即使出现错误也必须返回有效的json)所以你要缓存所有输出并且如果命中关闭( - via-register_shutdown_function())您将输出格式化为json - 具有相应的错误和跟踪数据等。这是我拥有的最大用途。但是你会遇到嵌套ob_start的问题。即便如此,如果真的有用或者没有,那也是有争议的。将输出转储到文本文件,以便进行错误报告也是一件好事,但除了在方法中使用它之外,它还更依赖于您的项目需求。
我做了非常敏感的工作,需要隐藏99%的错误输出并将其记录到文本中,并向最终用户显示一般错误;
这可能会让你感到头疼
/**
* dump all levels of ob_start into message
* @return string
*/
public static function obGetCleanNested(){
$message = '';
for($i=0; $i < ob_get_level(); $i++){
$message .= ob_get_clean();
}
return $message;
}
答案 1 :(得分:1)
class buffer {
public $output;
public function __construct($content) {
ob_start();
$this->output = $content;
}
public function endBuffer() {
$buffer = ob_get_clean();
$this->output = $buffer;
echo $this->output . "<br>";
}
public function showBufferStatus() {
if ($this->output == null) {
echo "nothing inside.";
} else {
echo $this->output;
}
}
}
$buffer = new buffer("Test"); // starts buffer
$buffer->showBufferStatus(); // checks content inside buffer
$buffer->endBuffer(); // ends it
echo "still there: ", $buffer->showBufferStatus(); // checks again
基本上,使用函数ob_get_clean()
,你现在实际上保存了一个移动,因此没有额外的方法。因为它同时执行ob_get_contents()
和ob_end_clean()
。
答案 2 :(得分:0)
“可以像这样使用输出缓冲吗?”
是的,它可以
“输出缓冲的使用会阻止在发送标头之前编写代码,但是,如果有的话,会有什么其他好处?”
您可以简单地对输出执行任何操作(压缩/更改某些部分)
**“如果有可能,这是否实用?”**
这取决于需求。如果代码以正确的方式编写,在大多数情况下,我可能不必使用输出缓冲。但有时尤其如果你想修改输出,使用输出缓冲区
非常方便答案 3 :(得分:0)
可以像这样使用输出缓冲吗?
是
使用输出缓冲可防止在发送标头之前写入代码,但是&gt;什么,如果有的话,其他好处会来自这个?
这几乎是唯一的好处。
如果可以的话,这是否实用?
这是一个意见问题。我的意见不是,其他人可能会说是,甚至其他人可能会说它没有“实际”效果,因为php并不关心你在哪里,为什么或多少次调用ob_start()
或{{ 1}}。
答案 4 :(得分:0)
<强>答案强>:
$this->contents = ob_get_contents();
内的someMethod()
与ob_end_clean();
内的someOtherMethod()
之间生成的所有输出将永远不会输出。ob_start()
的次数,每次它会更深一层。