PHP 8.3.4 Released!

debug_zval_dump

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

debug_zval_dumpСбрасывает строковое представление внутренней структуры zval на вывод

Описание

debug_zval_dump(mixed $value, mixed ...$values): void

Функция сбрасывает на вывод строковое представление внутренней структуры 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 показывает дополнительные копии, которые движок создаёт внутри, например, когда сохраняет литеральную строку или массив как часть инструкции кода.

Смотрите также

add a note

User Contributed Notes 1 note

up
3
Hayley Watson
4 years ago
If you're finding the interpretation of refcount confusing, the Xdebug extension offers a function similar to this one, but because the variable name is passed as a string, xdebug_debug_zval() doesn't scribble on the refcount with its own references to the zval.
To Top