(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
debug_zval_dump — Сбрасывает строковое представление внутренней структуры zval на вывод
Функция сбрасывает строковое представление внутренней структуры zval (значение движка Zend) в поток вывода. Эта информация приносит пользу для понимания или отладки деталей работы движка Zend Engine или PHP-модулей.
value
Обрабатываемая переменная.
values
Следующие переменные или значения для вывода.
Функция не возвращает значения после выполнения.
Пример #1 Пример использования функции debug_zval_dump()
<?php
$var1 = 'Hello';
$var1 .= ' World';
$var2 = $var1;
debug_zval_dump($var1);
?>
Результат выполнения приведённого примера:
string(11) "Hello World" refcount(3)
Замечание: Понимание
refcount
Значение
refcount
, которое показывает функция, может вызвать удивление без глубокого понимания деталей работы движка.Zend Engine подсчитывает ссылки по двум причинам:
- Оптимизация потребления памяти за счёт техники, которая называется «копирование при записи», когда несколько переменных с одним и тем же значением указывают на одну и ту же копию в памяти. Когда одна переменная изменяется, она указывает на новую копию в памяти, а счётчик ссылок на оригинал уменьшается на 1.
- Отслеживание переменных, которые были назначены или переданы по ссылке (смотрите «Объяснение ссылок»). Этот счётчик ссылок хранится в отдельной ссылке структуры zval, которая указывает на структуру zval текущего значения. Функция debug_zval_dump() пока не показывает эту дополнительную структуру zval.
Поскольку функция debug_zval_dump() принимает входные данные как обычные параметры, передаваемые по значению, для их передачи будет выполняться метод копирования при записи: вместо копирования данных счётчик ссылок увеличится на единицу на время вызова функции. Если бы функция изменила параметр после получения, то движок сделал бы копию; поскольку это не так, функция покажет счётчик ссылок на единицу больше, чем в вызывающей области.
Передача параметра также предотвратит отображение функцией debug_zval_dump() переменных, которые были назначены по ссылке. Чтобы проиллюстрировать это, приведём немного изменённую версию примера:
<?php
$var1 = 'Hello';
$var1 .= ' World';
// Укажем вторую и третью переменные как ссылки на одно и то же значение
$var2 =& $var1;
$var3 =& $var1;
debug_zval_dump($var1);
?>Результат выполнения приведённого примера:
string(11) "Hello World" refcount(2)Хотя переменные $var1, $var2 и $var3 связаны как ссылки, в функцию debug_zval_dump() передаётся только значение. Это значение обрабатывается один раз набором ссылок и один раз внутри функции debug_zval_dump(), поэтому счётчик ссылок равен 2.
Дополнительные сложности возникают из-за оптимизаций, которые проводит движок для разных типов данных. Для ряда типов, например целых чисел, движок не использует «копирование при записи», поэтому вообще не показывает счётчик ссылок. В других случаях счётчик refcount показывает дополнительные копии, которые движок создаёт внутри, например, когда сохраняет литеральную строку или массив как часть инструкции кода.