Поэтому у меня есть функция, такая как:
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);
И это выведет неупорядоченный список на мою страницу. Я знаю, что могу просто изменить эхо на переменную и вернуть переменную, но мне было просто любопытно, возможно ли ее захватить эхо-выход без изменения этой функции, просто изменив вызов функции в некотором роде?
Благодаря!
Да, используя буферизацию вывода .
<?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 ?>
Я также хочу упомянуть, насколько это полезно для модульного тестирования PHP, чтобы не загромождать ваши тестовые журналы с выходом того, что вы тестируете, если тест не сработает. Вот еще один ответ на стек, связанный с этим, потому что я нашел этот ответ первым в своем поиске Google, когда я смотрел, как тестировать элементы с выходом эха: как использовать буферизацию вывода в PHPUnit-тесте?