循环输出缓冲区

时间:2012-10-02 02:10:59

标签: php output-buffering

我看到来自ob_start()ob_end_*()的某些行为似乎非常违反直觉。

本着整洁的精神,我的算法是:

  1. 打开缓冲区
  2. 做一些事情
  3. 将缓冲区保存为字符串
  4. 关闭缓冲区
  5. 我在运行时为第一种情况之外的每个循环案例收到以下通知。

      

    注意:ob_end_clean():无法删除缓冲区。没有要删除的缓冲区   在C:... \ test \ TestOBError.php第21行

         

    注意:ob_end_clean():无法删除缓冲区。没有要删除的缓冲区   在C:... \ test \ TestOBError.php第21行

         

    注意:ob_end_clean():无法删除缓冲区。没有要删除的缓冲区   在C:... \ test \ TestOBError.php第21行

         

    当前故事有效载荷:“一个”。

         

    当前故事有效载荷:“两个”。

         

    当前故事有效载荷:“三”。

         

    当前故事有效载荷:'四'。

    示例代码(TestOBError.php):

    <?php
    class Story {
        public $payload;
        public function __construct($payload) {
            $this->payload = $payload;
        }
    }
    
    $stories = array();
    $stories[] = new Story('one');
    $stories[] = new Story('two');
    $stories[] = new Story('three');
    $stories[] = new Story('four');
    
    $foo = "";
    
    foreach ($stories as $story) {
        ob_start();
        require 'TestOBError_Foo.php';
        $foo .= ob_get_clean();
        ob_end_clean();
    }
    
    print $foo;
    
    ?>
    

    TestOBError_Foo.php的内容:

    <p>Current story payload: `<?php print $story->payload; ?>'.</p>
    

    我只是在滥用输出缓冲区吗?谁能告诉我“正确的方法”呢?

    我正在运行PHP 5.4.7版。

2 个答案:

答案 0 :(得分:3)

您无需同时拨打ob_get_clean()ob_end_clean()。要么这样做:

$foo .= ob_get_clean();

或者这样做:

$foo .= ob_get_contents();
ob_end_clean();

来自PHP manual

  

string ob_get_clean ( void )

     

获取当前缓冲区内容并删除当前输出缓冲区。

     

ob_get_clean()基本上执行ob_get_contents()和ob_end_clean()。

答案 1 :(得分:0)

在循环中非常简单并按预期工作:)

foreach($Records as $pp=>$Record){
    ob_start();
    include(STYLESHEETPATH.'/inc/set-record-vars.php');
    include(STYLESHEETPATH.'/inc/make-html-row.php'); //Here direct HTML output;
    $jsItems[] = array(
        'id' => $proxyId,
        'row' => ob_get_contents()
    );
    ob_end_clean();
}