debug_zval_dump()
Функция debug_zval_dump() — встроенная функция PHP, выводящая внутреннее представление переменной: тип, значение и счётчик ссылок.
Введение
Функция debug_zval_dump() — встроенная функция PHP, которая выводит внутреннее представление переменной так, как её хранит движок Zend: не просто значение, но и счётчик ссылок (refcount), а также признак ссылки (is_ref). Это своеобразное окно в систему управления памятью PHP, в частности в оптимизацию копирования при записи (copy-on-write).
Zval («Zend value») — контейнер уровня C, который PHP использует для каждой переменной. Несколько имён переменных могут указывать на один и тот же базовый zval; PHP создаёт физическую копию только при изменении одного из них. debug_zval_dump() позволяет наблюдать за этим учётом в реальном времени.
Устарела и удалена. Функция была объявлена устаревшей в PHP 7.2 и удалена в PHP 8.0. Она работает только в устаревших версиях PHP (до 7.4 включительно). В PHP 8+ этой функции не существует — ознакомьтесь с современными альтернативами ниже, прежде чем прибегать к ней.
Если вам нужно просто проверить тип и значение переменной, используйте var_dump() — она работает во всех версиях PHP и является стандартным инструментом отладки.
Синтаксис
Синтаксис функции debug_zval_dump() выглядит следующим образом:
PHP-синтаксис debug_zval_dump()
void debug_zval_dump(mixed $variable, mixed ...$rest): voidФункция принимает одну или несколько переменных и выводит внутреннее представление каждой. Она ничего не возвращает (void) — вывод идёт непосредственно в выходной поток. Каждая строка вывода соответствует шаблону:
type(value) refcount(N)type(value)— та же нотация типа/значения, что и вvar_dump(), напримерstring(5) "hello",int(42).refcount(N)— количество дескрипторов zval, указывающих на данное значение. Если установлен флагis_ref, в вывод добавляетсяis_ref=true.
Пример использования
Ниже приведён пример использования функции debug_zval_dump() в PHP:
Пример debug_zval_dump() в PHP
Здесь $b привязана по ссылке к $a, поэтому оба имени разделяют один zval, помеченный как ссылка. Вызов debug_zval_dump() для любого из них выводит одно и то же внутреннее значение:
string(5) "hello" refcount(3)
string(5) "hello" refcount(3)Почему refcount равен 3, а не 2. Можно было бы ожидать
2(для$aи$b). Лишняя единица появляется из-за самойdebug_zval_dump(): передача переменной в функцию временно добавляет ещё один дескриптор к zval, который учитывается до вывода значения. Это известная особенность — воспринимайте выводимое значение счётчика относительно базового уровня, а не как абсолютную истину.
Наблюдение за копированием при записи
Более наглядный сценарий — наблюдение за тем, как PHP совместно использует, а затем разделяет значение. Обычные (не ссылочные) переменные разделяют один zval до тех пор, пока одна из них не будет изменена:
<?php
$a = "hello";
debug_zval_dump($a); // refcount(2): $a + the function argument
$b = $a; // no copy yet — $a and $b share one zval
debug_zval_dump($a); // refcount(3): $a, $b, and the argument
$b = "world"; // write triggers the copy ("copy-on-write")
debug_zval_dump($a); // back to refcount(2): $b now has its own zval
?>Рост refcount при присваивании и его снижение при изменении копии — это копирование при записи в действии: PHP откладывал дублирование строки "hello" до тех пор, пока это действительно не потребовалось.
Заключение
Функция debug_zval_dump() исторически использовалась для инспекции счётчиков ссылок и поведения механизма копирования при записи в движке Zend. Она выводит тип, значение и статус refcount/is_ref переменной, что помогало разработчикам понять, когда PHP на самом деле копирует данные. Сегодня она представляет преимущественно учебный интерес, поскольку недоступна в PHP 8+.
Современные альтернативы
Поскольку debug_zval_dump() недоступна в PHP 8+, используйте следующие функции:
var_dump()— стандартный инструмент для проверки типа и значения любой переменной. Используйте её для повседневной отладки.print_r()— вывод array и объектов в удобочитаемом формате, опционально возвращаемый в виде строки.var_export()— выводит корректное PHP-представление значения, которое можно вставить обратно в исходный код.gettype()— когда нужно узнать только имя типа переменной.xdebug_debug_zval()— наиболее близкая замена для инспекции счётчика ссылок, доступная при установленном расширении Xdebug.