Можно ли захватить вывод эха в PHP?

Итак, у меня есть такая функция, как:

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); 

И это выведет неупорядоченный список на мою страницу. Я знаю, что могу просто изменить эхо на переменную и вернуть переменную, но мне было просто любопытно, возможно ли ее захватить эхо-выход без изменения этой функции, просто изменив вызов функции в некотором роде?

Спасибо!

Ответ 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-тесте?