Вывод переменных

Каждому отладчику знакома функция var_dump, которая выводит подробную информацию о переменной. К сожалению, её вывод лишён HTML-форматирования и сливается в одну строку, не говоря уже об экранировании HTML. На практике var_dump необходимо заменить более удобной функцией. Такая функция – dump().

$arr = [10, 20.2, true, null, 'hello'];

dump($arr);
// или Debugger::dump($arr);

порождает вывод:

Светлую тему по умолчанию можно сменить на тёмную:

Debugger::$dumpTheme = 'dark';

Можно также изменить глубину вложенности через Debugger::$maxDepth, длину выводимых строк через Debugger::$maxLength и количество показываемых элементов массива или объекта через Debugger::$maxItems. Естественно, меньшие значения ускоряют отрисовку.

Debugger::$maxDepth = 2; // по умолчанию: 15
Debugger::$maxLength = 50; // по умолчанию: 150
Debugger::$maxItems = 50; // по умолчанию: 100

Функция dump() может показывать и место, откуда она была вызвана, а для объектов – путь к файлу, где определён их класс. Этим управляет свойство Debugger::$showLocation:

Debugger::$showLocation = true; // показывает сведения о месте
Debugger::$showLocation = false; // скрывает их

Для более тонкого управления вызовите напрямую Tracy\Dumper::dump() и передайте параметр Dumper::LOCATION со значением Dumper::LOCATION_CLASS (только места определения классов) или Dumper::LOCATION_SOURCE (ещё и место вызова dump()).

Практичные альтернативы dump() – это dumpe() (dump & exit) и bdump(). Последняя позволяет выводить значения переменных в панели Tracy Bar. Это очень удобно, потому что дампы отделены от оформления страницы и им можно ещё и дать заголовок.

bdump([2, 4, 6, 8], 'чётные числа до десяти');
bdump([1, 3, 5, 7, 9], 'нечётные числа до десяти');

Прямое использование Tracy\Dumper

За dump() стоит класс Tracy\Dumper, который вы можете использовать и напрямую. В отличие от dump(), он не зависит от Debugger и берёт все настройки из массива параметров, что удобно для самостоятельных скриптов, CLI-инструментов или всегда, когда дамп нужен в виде строки. Поскольку настройки берутся из массива, а не из Debugger, значения по умолчанию немного отличаются: глубина, например, равна 7 вместо 15.

Методы возвращают дамп в виде строки:

use Tracy\Dumper;

$html = Dumper::toHtml($var, [Dumper::DEPTH => 3]);  // HTML для браузера
$text = Dumper::toText($var);                         // обычный текст, например для лога
$ansi = Dumper::toTerminal($var);                     // текст с ANSI-цветами для терминала

Либо выведите переменную сразу через Dumper::dump(), который сам выбирает HTML или терминальный вывод в зависимости от окружения:

Dumper::dump($var, [Dumper::DEPTH => 3]);

HTML-выводу нужны небольшой стиль и скрипт. Когда вы выводите дамп вне приложения с включённой Tracy (то есть без Debugger::enable()), выведите их один раз в head страницы через Dumper::renderAssets(). Dumper::dump() делает это сам, а toHtml() – нет.

Параметры

Выводом управляет массив параметров, передаваемый всем перечисленным выше методам:

Параметр Описание По умолчанию
Dumper::DEPTH максимальная глубина вложенности 7
Dumper::TRUNCATE максимальная длина строк 150
Dumper::ITEMS максимальное количество показываемых элементов массива или объекта 100
Dumper::COLLAPSE свернуть верхний узел? true/false либо свернуть, когда у него хотя бы столько элементов 14
Dumper::COLLAPSE_COUNT свернуть вложенный узел, когда у него хотя бы столько элементов 7
Dumper::LOCATION показывать место; true/false либо Dumper::LOCATION_CLASS (только места определения классов) или Dumper::LOCATION_SOURCE (ещё и место вызова) выключено
Dumper::THEME цветовая тема, light или dark light
Dumper::HASH показывать ID объектов (метка #) и ссылки (метка &)? true
Dumper::DEBUGINFO использовать магический метод объекта __debugInfo()? false
Dumper::KEYS_TO_HIDE массив имён ключей, значения которых скрываются как ***** []
Dumper::SCRUBBER callback fn(string $key, mixed $value, ?string $class): bool, возвращающий true для конфиденциальных значений нет
Dumper::OBJECT_EXPORTERS собственная отрисовка объектов, см. ниже []

Параметры COLLAPSE, COLLAPSE_COUNT и THEME относятся только к интерактивному HTML-выводу.

Параметр SCRUBBER скрывает в дампе конфиденциальные значения, полный пример смотрите в разделе Собственный scrubber.

Например, чтобы получить компактный дамп без хешей объектов:

echo Dumper::toText($var, [Dumper::HASH => false]);

ANSI-цвета, используемые в toTerminal(), можно настроить через Dumper::$terminalColors.

Собственная отрисовка объектов

По умолчанию dumper отображает объект перечислением его свойств. Иногда это не самый полезный вид: например, PhpToken показывает свой тип числовым идентификатором вместо читаемого имени. Вы можете научить dumper отрисовывать конкретный класс, зарегистрировав экспортёр в Dumper::$objectExporters:

use Tracy\Dumper;

Dumper::$objectExporters[PhpToken::class] = function (PhpToken $token, Dumper\Value $value): void {
	$value->value = $token->getTokenName() . ' ' . $token->text;
};

Экспортёр получает объект и объект Tracy\Dumper\Value, описывающий, как объект будет показан. Присваивание в $value->value заменяет заголовок (по умолчанию имя класса) вашим собственным текстом, так что вместо списка свойств вы получите компактную читаемую подпись. Настройка действует для каждого дампа этого класса, в том числе для объектов, вложенных в массивы или другие объекты. Как вариант, экспортёры можно передать только для одного вызова через параметр Dumper::OBJECT_EXPORTERS метода Tracy\Dumper::dump().