可以捕获PHP回音输出吗?

可以捕获PHP回音输出吗?,php,stdout,echo,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 '&

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

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>';
    }
}
这会将一个无序列表转储到我的页面上。我知道我可以将echo更改为一个变量并返回该变量,但我只是想知道是否可以在不修改该函数的情况下捕获echo输出,而只是以某种方式修改对该函数的调用

谢谢

是的,使用


与前面的答案非常相似,但就我的目的而言更为简洁:

<?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输出测试项目时,我首先在谷歌搜索中找到了这个答案:

非常有趣,感谢您提供了简洁而好的答案。:-)@Pekka:就我的一个项目的小型MVC框架设计而言,这是一个好方法吗?我有一个应用程序,它的数据依赖于soapweb服务,这是一个Render类,它通过参数接受对象,并根据对象呈现HTML,正如您在无序列表函数中看到的那样。只是好奇你对这件事有什么想法。基于这个解决方案,我可以看到index.php这样的页面有很多ob_start、ob_end_清理,其间有函数调用。也许我学到了一些新的东西,但仍然需要修改呈现函数的静态库?@Pekka:也许我可以让呈现类的函数都包含ob_start()、ob_get_contents()、ob_end_clean(),并为这个类添加一个公共字段,该字段附加了ob_get_contents的结果?这样,我就可以使用Render类构建页面,并在最后执行一个简单的echo呈现:$contentsfield@Chris Mmm,在我看来,将输出缓冲作为库的一部分听起来不是一个好的做法。这更像是你不得不做的事情,例如,当你与一个外部库一起工作时,它会回显一些东西。为什么不改变类方法的行为来返回数据,而不是回显数据,并使页面本身(调用呈现类的页面)回显结果?很公平,根据我在SE周围看到的情况,我将全心全意地接受您的建议。:-)干杯,伙计。
<?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
 ?>
<?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
?>