3

我看到了一些行为ob_start()ob_end_*()这似乎非常违反直觉。

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

  1. 打开缓冲区
  2. 做一些事情
  3. 将缓冲区保存为字符串
  4. 关闭缓冲区

对于第一个案例之外的每个循环案例,我在运行时收到以下通知。

注意:ob_end_clean():删除缓冲区失败。在第 21 行的 C:...\testing\TestOBError.php 中没有要删除的缓冲区

注意:ob_end_clean():删除缓冲区失败。在第 21 行的 C:...\testing\TestOBError.php 中没有要删除的缓冲区

注意:ob_end_clean():删除缓冲区失败。在第 21 行的 C:...\testing\TestOBError.php 中没有要删除的缓冲区

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

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

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

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

示例代码(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。

4

2 回答 2

3

您不需要同时调用ob_get_clean()ob_end_clean()。要么这样做:

$foo .= ob_get_clean();

或者这样做:

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

PHP 手册

字符串ob_get_clean ( 无效 )

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

ob_get_clean()本质上同时执行 ob_get_contents() 和 ob_end_clean()。

于 2012-10-02T02:12:59.310 回答
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();
}
于 2014-01-15T15:39:43.277 回答