可以捕获PHP回声输出吗?

Chr*_*ris 16 php stdout echo

所以我有一个功能,如:

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>';
    }
}
Run Code Online (Sandbox Code Playgroud)

此函数循环一些项目并呈现无序列表.我想知道的是,如果我愿意,它是否可以捕获回声输出.

我通过执行以下操作来打电话来使用此功能:

Render::UnorderedList(Class::getItems(), Class::getFields(), true); 
Run Code Online (Sandbox Code Playgroud)

这会将无序列表转储到我的页面上.我知道我可以将echo更改为变量并返回变量,但我只是好奇是否有可能捕获echo输出而不修改该函数,只是以某种方式修改对函数的调用?

谢谢!

Pek*_*ica 46

是的,使用输出缓冲.

<?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
 ?>
Run Code Online (Sandbox Code Playgroud)


Kev*_*icz 5

与之前的答案非常相似,但对于我的目的来说更简洁:

<?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
?>
Run Code Online (Sandbox Code Playgroud)

我还想提一下这对于 PHP 单元测试有多么有用,以免测试日志与正在测试的输出混乱,除非测试失败。这是与此相关的另一个 stackflow 答案,因为当我查看如何使用 echo 输出测试项目时,我首先在谷歌搜索中找到了这个答案:How to use output buffering inside PHPUnit test?