我看到来自ob_start()
和ob_end_*()
的某些行为似乎非常违反直觉。
本着整洁的精神,我的算法是:
我在运行时为第一种情况之外的每个循环案例收到以下通知。
注意: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版。
答案 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();
}