W3docs

Функция 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() выполняет два действия сразу:

  1. Get — возвращает текущее содержимое верхнего буфера вывода в виде строки.
  2. 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().

Practice

Практика
What does the 'ob_get_clean()' function in PHP do?
What does the 'ob_get_clean()' function in PHP do?
Was this page helpful?