所以我有一个如下功能:
public static function UnorderedList($items, $field, $view = false){
if(count($items) > 0){
echo '<ul>';
foreach($items as $item){
echo '<li>';
if($view){
echo '<a href="'.$view.'id='.$item->sys_id.'" title="View Item">'.$item->$field.'</a>';
}else{
echo $item->$field;
}
echo '</li>';
}
echo '</ul>';
}else{
echo '<p>No Items...</p>';
}
}
此函数循环某些项目并呈现无序列表。我想知道的是,如果我愿意,它是否可以捕获回声输出。
我通过执行以下操作来调用此函数:
Render::UnorderedList(Class::getItems(), Class::getFields(), true);
这会将无序列表转储到我的页面上。我知道我可以将echo更改为变量并返回变量,但我只是好奇是否有可能捕获echo输出而不修改该函数,只是以某种方式修改对函数的调用?
谢谢!
答案 0 :(得分:45)
是的,使用output buffering。
<?php
ob_start(); // Start output buffering
Render::UnorderedList(Class::getItems(), Class::getFields(), true);
$list = ob_get_contents(); // Store buffer in variable
ob_end_clean(); // End buffering and clean up
echo $list; // will contain the contents
?>
答案 1 :(得分:1)
非常类似于之前的回答,但为我的目的更简洁:
<?php
ob_start(); // Start output buffering
Render::UnorderedList(Class::getItems(), Class::getFields(), true);
$list = ob_get_clean(); // Store buffer AND cleans it
echo $list; // will contain the contents
?>
我还想提一下这对PHP单元测试有多大用处,以免你的测试日志与你测试的输出混乱,除非测试失败。这是与此相关的另一个stackflow答案,因为当我在研究如何使用echo输出测试项目时,我首先在谷歌搜索中找到了这个答案:How to use output buffering inside PHPUnit test?