W3docs

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

php— editable, runs on the server

Здесь $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.

Практика

Практика
Что делает функция debug_zval_dump() в PHP?
Что делает функция debug_zval_dump() в PHP?
Was this page helpful?