Ob get clean: примеры (PHP)

Использование ob_get_clean для работы с буфером вывода
Раздел: Буферизация вывода
ob_get_clean: string|false

Функция ob_get_clean

Назначение и описание

Функция ob_get_clean() в языке PHP используется для получения текущего содержимого буфера вывода с последующей его очисткой и отключением буферизации. Она объединяет функционал ob_get_contents() и ob_end_clean(). Вызов этой функции допустим только при активной буферизации, инициированной функциями ob_start(), ob_list_handlers().

Аргументы функции

Функция ob_get_clean() не принимает никаких параметров.

Возвращаемое значение

Функция возвращает строку (string) с содержимым буфера вывода. Если буферизация не активна, функция вернет значение false.

Примеры использования ob_get_clean

Базовый пример

Пример получения HTML-кода, сгенерированного внутри буфера.

<?php
ob_start();
echo "<div>Пример содержимого</div>";
$content = ob_get_clean();
echo "Получено: " . htmlspecialchars($content);
?>
Получено: <div>Пример содержимого</div>
Проверка активности буфера

Проверка возвращаемого значения при отсутствующем буфере.

<?php
// Буферизация не запущена
$result = ob_get_clean();
var_dump($result);
?>
bool(false)

Альтернативные функции PHP

Получает содержимое буфера без его очистки или отключения. Буфер остается активным. Предпочтительна, когда требуется многократное чтение данных из буфера.

Очищает буфер вывода и отключает буферизацию без возврата содержимого. Используется, когда сгенерированные данные не требуются.

Выводит содержимое текущего буфера, возвращает его как строку и отключает буферизацию. Отличие от ob_get_clean() в немедленном выводе содержимого.

Выводит содержимое буфера и отключает буферизацию без возврата данных. Аналог ob_end_clean() с выводом.

Аналоги в других языках

Python (io.StringIO)

Контекстные менеджеры и объекты вроде io.StringIO используются для перехвата вывода.

import io
import sys

old_stdout = sys.stdout
sys.stdout = buffer = io.StringIO()
print("Содержимое буфера")
sys.stdout = old_stdout
content = buffer.getvalue()
print(f"Получено: {content}")
Получено: Содержимое буфера

Ob get clean в Javascript

Прямого аналога нет. Для перехвата вывода консоли можно переопределить console.log.

let output = [];
const originalLog = console.log;
console.log = (...args) => {
    output.push(args.join(' '));
};
console.log("Тестовое сообщение");
console.log = originalLog;
console.log("Перехвачено:", output);
Перехвачено: [ "Тестовое сообщение" ]

Ob get clean в MySQL

Язык SQL не имеет встроенных механизмов буферизации вывода, подобных PHP.

Типичные ошибки

Вызов без активного буфера

Наиболее частая ошибка - попытка вызова функции, когда буферизация не запущена.

<?php
// ob_start() не вызывался
$data = ob_get_clean();
if ($data === false) {
    echo "Ошибка: буфер не активен.";
}
?>
Ошибка: буфер не активен.
Многократный вызов

Повторный вызов после очистки буфера также приводит к ошибке.

<?php
ob_start();
echo "Текст";
$first = ob_get_clean(); // буфер очищен и отключен
$second = ob_get_clean(); // false, буфера больше нет
var_dump($second);
?>
bool(false)

История изменений

Функция ob_get_clean() была добавлена в PHP 4.3.0. С тех пор ее поведение оставалось стабильным. В PHP 5.4.0 улучшена обработка вложенных буферов. Начиная с PHP 8.0.0, при вызове без активного буфера возвращается пустая строка, а не false, если буфер был очищен с помощью ob_end_clean() в том же уровне буферизации. Однако при полностью отсутствующем буфере по-прежнему возвращается false.

Расширенные примеры

Вложенная буферизация

Пример использования нескольких уровней буферизации.

Пример php
<?php
ob_start();
echo "Внешний буфер. ";
ob_start();
echo "Внутренний буфер. ";
$inner = ob_get_clean();
echo "Получен внутренний: " . $inner;
$outer = ob_get_clean();
echo "Итог: " . $outer;
?>
Итог: Внешний буфер. Получен внутренний: Внутренний буфер.
Использование с callback-функцией

Буфер может обрабатываться callback-функцией, заданной в ob_start().

Пример php
<?php
function process_buffer($buffer) {
    return strtoupper($buffer);
}
ob_start('process_buffer');
echo "текст для обработки";
$content = ob_get_clean();
echo $content;
?>
ТЕКСТ ДЛЯ ОБРАБОТКИ
Захват вывода функции

Перехват данных, генерируемых функцией.

Пример php
<?php
function generate_html() {
    echo "<span>Сгенерированный HTML</span>";
}
ob_start();
generate_html();
$function_output = ob_get_clean();
echo "Захвачено: " . htmlspecialchars($function_output);
?>
Захвачено: <span>Сгенерированный HTML</span>
Буферизация для API-ответов

Формирование JSON-ответа с перехватом возможных случайных выводов.

Пример php
<?php
ob_start();
// Код, который может случайно что-то вывести
$data = ['status' => 'ok', 'value' => 42];
echo json_encode($data);
$response = ob_get_clean();
header('Content-Type: application/json');
echo $response;
?>
{"status":"ok","value":42}

PHP ob_get_clean function comments

En
Ob get clean Get current buffer contents and delete current output buffer