Avatar ·

Как сохранить результат var_dump() в строку в PHP?

Всем привет! Я новичок в PHP и столкнулся с такой проблемой.

Мне нужно получить дамп переменной (массива или объекта) в виде строки, чтобы записать его в лог-файл или отправить по email для отладки. Функция var_dump() отлично показывает структуру данных, но она сразу выводит результат в браузер или консоль. А мне нужно именно сохранить этот вывод в строковую переменную.

Вот пример кода, с которым я работаю:

<?php
$data = [
    'name' => 'Иван',
    'age' => 30,
    'skills' => ['PHP', 'JavaScript', 'Python']
];

// var_dump выводит прямо в вывод
var_dump($data);

// Мне нужно что-то вроде:
// $logString = var_dump_to_string($data);
// file_put_contents('debug.log', $logString);
?>

Я пробовал использовать print_r(), но он не показывает типы данных (например, не видно, что строка — это строка, а число — число). var_export() выводит валидный PHP-код, но это не то, что мне нужно — хочется именно форматирования как в var_dump().

Подскажите, есть ли в PHP встроенная функция для этого? Или придется писать свою обертку? Заранее спасибо!

<<>>

Использование буферизации вывода (ob_start / ob_get_clean)

Стандартный и самый распространенный способ — перехватить вывод var_dump() с помощью механизма буферизации вывода PHP. Это работает на любой версии PHP (начиная с 4.3.0).

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

Вот как это выглядит на практике:

<?php
function var_dump_to_string($variable): string {
    ob_start();               // Включаем буферизацию вывода
    var_dump($variable);      // Вывод попадает в буфер
    $result = ob_get_clean(); // Получаем содержимое буфера и отключаем его
    return $result;
}

// Пример использования:
$data = [
    'name' => 'Иван',
    'age' => 30,
    'skills' => ['PHP', 'JavaScript', 'Python']
];

$logString = var_dump_to_string($data);
file_put_contents('debug.log', $logString);
echo "Дамп сохранен в файл!";
?>

Как это работает:

  • ob_start() — включает буферизацию. Весь последующий вывод (echo, print, var_dump) не отправляется браузеру, а сохраняется во внутреннем буфере.
  • var_dump($variable) — выводит дамп, но теперь он попадает в буфер.
  • ob_get_clean() — возвращает содержимое буфера в виде строки и одновременно отключает буферизацию. Если вызвать ob_get_contents() вместо этого, буфер останется активным.

Важные моменты:

  • Убедитесь, что до вызова ob_start() нет вложенной буферизации, которая может конфликтовать. Если вы работаете внутри другого буфера, используйте ob_get_level() для проверки.
  • Функция var_dump() выводит дамп в текстовом формате, не экранируя HTML. Если вы планируете выводить строку в браузер, оберните её в <pre> или используйте htmlspecialchars().
  • Для больших структур данных буферизация может потреблять много памяти, но для отладки это обычно не критично.

Более короткая версия (однострочник):

$logString = ob_get_clean() ?: var_dump($data) . ''; // Неправильно!
// Правильный вариант:
$logString = (function($v) { ob_start(); var_dump($v); return ob_get_clean(); })($data);

Но лучше всё-таки использовать функцию для читаемости.

Этот подход считается «каноническим» на Stack Overflow и используется в реальных проектах, включая фреймворки (например, Laravel использует подобный метод в своих утилитах отладки).

<<>>

Альтернатива: print_r() с флагом true

Если вам не обязательно видеть типы данных (int, string, bool) в дампе, а достаточно просто красиво отформатированной структуры, можно использовать print_r() со вторым параметром true:

<?php
$data = ['a' => 1, 'b' => 'hello', 'c' => [1,2,3]];
$string = print_r($data, true);
file_put_contents('log.txt', $string);
?>

Этот метод возвращает строку, а не выводит её. Он проще и быстрее буферизации, но есть нюансы:

  • print_r() не показывает null как NULL, а пустую строку как '' — он просто выводит пустое место.
  • Для объектов он показывает только публичные свойства (если не использовать __debugInfo()).
  • Нет информации о типах: число 1 и строка "1" выглядят одинаково.

Когда использовать: если вам нужно просто записать структуру данных в лог для быстрого просмотра, и типы не важны. Для полноценной отладки всё же лучше первый вариант с буферизацией var_dump().