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

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

Добавить

Примечания пользователей 1 note

up
3
Hayley Watson
5 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