array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'function.debug-zval-dump.php', 1 => 'debug_zval_dump', ), 'up' => array ( 0 => 'ref.var.php', 1 => 'Функции для работы с переменными', ), 'prev' => array ( 0 => 'function.boolval.php', 1 => 'boolval', ), 'next' => array ( 0 => 'function.doubleval.php', 1 => 'doubleval', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'reference/var/functions/debug-zval-dump.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(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 показывает дополнительные копии, которые движок создаёт внутри, например, когда сохраняет литеральную строку или массив как часть инструкции кода.