能否捕获PHP的echo输出?

20

所以我有一个这样的函数:

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更改为变量并返回该变量,但我只是好奇是否有可能在不修改函数的情况下捕获echo输出,仅通过某种方式修改对函数的调用?

谢谢!

2个回答

57

可以使用输出缓冲

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

@Pekka:就我这个项目而言,为一个小型MVC框架设计,这是一个好的方式吗?我的应用程序依赖于SOAP Web服务来获取数据,并且这是一个渲染类,它通过参数接受对象并基于它们呈现HTML,就像您在unorderedlist函数中看到的那样。只是好奇您对此有何想法。根据该解决方案,我可以看到像index.php这样的页面会有很多ob_start、ob_end_cleans和其中的函数调用。也许我学到了一些新东西,但仍需要重新设计静态渲染函数库? - Chris
@Pekka:也许我可以让Render类的所有函数都有ob_start(),ob_get_contents(),ob_end_clean()的功能,并为该类添加一个公共字段,该字段附加ob_get_contents的结果?这样,我就可以使用Render类构建页面,在最后只需简单地echo Render::$contentsfield即可。 - Chris
@Chris Mmm,在库的一部分中使用输出缓冲似乎不是一个好的做法。这更像是你必须要做的事情,例如当与回显内容的外部库一起工作时。为什么不改变类方法的行为,使其返回数据而不是回显它,并让页面本身(调用Render类的页面)回显结果呢? - Pekka
好的,根据我在 SE 上看到的你的表现,我会全心全意地接受你的建议。 :-) 干杯,伙计。 - Chris

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接