Функция PHP ob_get_clean(): всё, что нужно знать
Функция ob_get_clean() возвращает содержимое буфера вывода и отключает буферизацию. Узнайте синтаксис, примеры и типичные ошибки.
Функция ob_get_clean() перехватывает всё, что PHP записал в буфер вывода, возвращает это в виде строки и одновременно отключает буферизацию. Это стандартный способ получить сгенерированный вывод как переменную вместо того, чтобы отправлять его прямо в браузер — удобно для шаблонизации, кэширования фрагментов или постобработки HTML перед отображением.
На этой странице рассматривается, что возвращает ob_get_clean(), чем она отличается от связанных функций буфера, а также практические паттерны и подводные камни при её использовании.
Что делает ob_get_clean()
Буферизация вывода позволяет PHP накапливать вывод (из echo, print, printf, а также из сырого HTML между ?> и <?php) в памяти, не отправляя его немедленно. Она включается функцией ob_start(), а содержимое буфера можно захватить или освободить позже.
ob_get_clean() выполняет два действия сразу:
- Get — возвращает текущее содержимое верхнего буфера вывода в виде строки.
- Clean — сбрасывает этот буфер и отключает его (эквивалентно вызову
ob_get_contents(), за которым следуетob_end_clean()).
Поскольку функция одновременно читает и удаляет буфер, захваченный вывод не попадает в браузер, если вы сами не выведете его через echo.
Синтаксис
ob_get_clean(): string|falseФункция не принимает аргументов. Она возвращает содержимое буфера в виде строки при успехе или false, если буферизация вывода не активна (то есть нет буфера для чтения).
Базовый пример
<?php
ob_start(); // start buffering
echo "This will be buffered"; // captured, not printed
$output = ob_get_clean(); // grab it and stop buffering
echo strtoupper($output); // now we control the outputВывод:
THIS WILL BE BUFFEREDСтрока echo "This will be buffered" сама по себе никогда не попадает в браузер — она сохраняется в буфере, возвращается в $output и выводится только после преобразования функцией strtoupper().
Практическое применение: захват отрендеренного шаблона
Распространённый реальный сценарий — рендеринг файла шаблона в строку, чтобы вернуть, закэшировать или отправить его по электронной почте:
<?php
function renderTemplate(string $file, array $data): string
{
extract($data); // turn array keys into local variables
ob_start();
include $file; // the template's HTML/echo output is buffered
return ob_get_clean(); // return it as a string
}
// Usage (assuming a greeting.php that echoes "Hello, $name!"):
// $html = renderTemplate('greeting.php', ['name' => 'Ada']);Здесь включаемый файл может содержать обычный HTML и теги <?= $name ?>; ob_get_clean() превращает весь отрендеренный результат в возвращаемую строку вместо того, чтобы выводить его.
ob_get_clean() и связанные функции
| Функция | Возвращает содержимое? | Останавливает буферизацию? | Отправляет в следующий буфер/браузер? |
|---|---|---|---|
ob_get_clean() | Да | Да | Нет (отбрасывается) |
ob_get_contents() | Да | Нет | Нет (буфер остаётся активным) |
ob_end_clean() | Нет | Да | Нет (отбрасывается) |
ob_get_flush() | Да | Да | Да (сбрасывается наружу) |
Используйте ob_get_clean(), когда вам нужен захваченный вывод и вы не хотите, чтобы он куда-либо отправлялся автоматически.
Типичные ошибки
- Нет активного буфера →
false. Вызовob_get_clean()без соответствующегоob_start()вернётfalseи выдаст уведомление. Защититесь с помощьюob_get_level()или убедитесь, что буферизация включена. - Функция затрагивает только верхний буфер. Буферы могут вкладываться. Если вы дважды вызвали
ob_start(),ob_get_clean()закроет только самый внутренний буфер; внешний буфер останется активным. - После вызова вывод исчезает. После очистки буфер пуст — вызовите функцию один раз и сохраните результат в переменную, если он понадобится вам более одного раза.
- Строгое сравнение для проверки на пустоту. Пустой буфер возвращает
"", а неfalse. Используйте=== false, чтобы различить «нет буфера» и «буфер был пуст».
Заключение
ob_get_clean() — основная функция, когда вам нужен буферизованный вывод в виде строки и вы хотите отключить буферизацию после этого, не отправляя ничего в браузер. Она хорошо сочетается с ob_start() и лежит в основе таких паттернов, как рендеринг шаблонов и кэширование вывода. Для связанных операций — сохранения буфера открытым, его сброса наружу или простого отбрасывания — смотрите ob_get_contents(), ob_get_flush() и ob_end_clean().