Функции за променливи
PHP Manual

debug_zval_dump

(PHP 4 >= 4.2.0, PHP 5)

debug_zval_dumpИзвежда информация за вътрешна zend стойност във вид на низ

Описание

void debug_zval_dump ( mixed $variable )

Извежда информация за вътрешна zend стойност във вид на низ

Параметри

variable

Променливата, която ще се анализира.

Връщани стойности

Няма връщана стойност.

Примери

Example #1 Пример за debug_zval_dump()

<?php
$var1 
'Hello World';
$var2 '';

$var2 =& $var1;

debug_zval_dump(&$var1);
?>

Примерът по-горе ще изведе:

&string(11) "Hello World" refcount(3)

Забележка: Обърнете внимание на refcount
Стойността refcount, върната от тази функция, не винаги е очевидна. Например, даден програмист може да очаква от горния пример да покаже refcount със стойност 2. В действителност, третата референция се създава при извикването на функцията debug_zval_dump().
Това поведение може да се забележи и в други случаи, например когато променлива не се подава към функцията по референция debug_zval_dump(). За да го осмислите, прегледайте променената версия на горния пример:

<?php
$var1 
'Hello World';
$var2 '';

$var2 =& $var1;

debug_zval_dump($var1); // този път променливата не е подадена по референция
?>

Примерът по-горе ще изведе:

string(11) "Hello World" refcount(1)


Защо refcount(1)? Защото при извикването на функцията е създадено копие на $var1.
Поведението на функцията става още по-объркващо, когато променлива със стойност за refcount 1 се подава (по копие/стойност):

<?php
$var1 
'Hello World';

debug_zval_dump($var1);
?>

Примерът по-горе ще изведе:

string(11) "Hello World" refcount(2)


Стойността 2 на refcount, е крайно неясна в този случай. Особено след осмислянето на горните примери. Какво в действителност се случва?
Когато дадена променлива има една референция (като $var1, преди да се използва като аргумент на debug_zval_dump()), PHP оптимизира начина, по който се подава на функцията. Вътрешно PHP смята $var1 за референция (тъй като refcount е увеличен до обхвата на функцията), с уговорката, че ако подадената референция се запише, ще й се създаде копие, но само в момента на записване. Това поведение е известно като "копиране при записване" (copy on write).
И така, ако се случи функцията debug_zval_dump() да пише върху свой собствен параметър (дори да не е наложително), ще се създаде копие. Дотогава параметърът остава референция, като кара стойността на refcount да се увеличи на 2 за областта на действие на функцията.

Вж. също


Функции за променливи
PHP Manual