我看到 ob_start()
和 ob_end_*()
的一些行为似乎非常违反直觉。
本着简洁的精神,我的算法是:
- 打开缓冲区
- 做一些事情
- 将缓冲区保存为字符串
- 关闭缓冲区
对于第一种情况之外的每个循环情况,我在运行时收到以下通知。
Notice: ob_end_clean(): failed to delete buffer. No buffer to delete in C:...\testing\TestOBError.php on line 21
Notice: ob_end_clean(): failed to delete buffer. No buffer to delete in C:...\testing\TestOBError.php on line 21
Notice: ob_end_clean(): failed to delete buffer. No buffer to delete in C:...\testing\TestOBError.php on line 21
Current story payload: `one'.
Current story payload: `two'.
Current story payload: `three'.
Current story payload: `four'.
示例代码(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 版。
最佳答案
您不需要同时调用 ob_get_clean()
和 ob_end_clean()
。要么这样做:
$foo .= ob_get_clean();
或者这样做:
$foo .= ob_get_contents();
ob_end_clean();
来自PHP manual :
string ob_get_clean ( void )
Gets the current buffer contents and delete current output buffer.
ob_get_clean() essentially executes both ob_get_contents() and ob_end_clean().
关于php - 在输出缓冲区上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683651/