可以捕获PHP回声输出吗?

2022-08-30 20:20:33

所以我有一个函数,例如:

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输出,只是以某种方式修改对函数的调用?

谢谢!


答案 1

是的,使用输出缓冲

<?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
 ?>

答案 2

与之前的答案非常相似,但为了我的目的,更简洁一些:

<?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单元测试是多么有用,这样除非测试失败,否则不会将测试日志与您正在测试的内容的输出混为一谈。这是另一个与此相关的堆栈流答案,因为我在Google搜索中首先发现了这个答案,当时我正在研究如何使用回声输出来测试项目:如何在PHPUnit测试中使用输出缓冲?


推荐