在一个类方法中启动输出缓冲,并在另一个类方法中结束它

时间:2014-07-06 07:30:03

标签: php

我已经在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;
    }
}  

考虑上面的示例代码。

问题

  • 可以像这样使用输出缓冲吗?
  • 使用输出缓冲可以防止在发送标头之前编写代码,但是,如果有的话,会有什么其他好处?
  • 如果可行,是否实用?

5 个答案:

答案 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()的次数,每次它会更深一层。