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

# debug_zval_dump

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

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

### Описание

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

Функция сбрасывает строковое представление внутренней структуры zval (значение движка Zend) в поток вывода. Эта информация приносит пользу для понимания или отладки деталей работы движка Zend Engine или PHP-модулей.

### Список параметров

`value`

  Обрабатываемая переменная.

`values`

  Следующие переменные или значения для вывода.

### Возвращаемые значения

Функция не возвращает значения после выполнения.

### Список изменений

Версия | Описание
--- | ---
8.4.0 | Функция debug_zval_dump() теперь указывает, является ли массив упакованным.

### Примеры

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

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

- var_dump() - Выводит информацию о переменной
- debug_backtrace() - Генерирует обратную трассировку вызовов функций
- Раздел «Объяснение ссылок»
- Статья » Объяснение PHP-ссылок, которое даёт Derick Rethans

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open