(PHP 4 >= 4.2.0, PHP 5)
debug_zval_dump — Извежда информация за вътрешна zend стойност във вид на низ
Извежда информация за вътрешна zend стойност във вид на низ
Променливата, която ще се анализира.
Няма връщана стойност.
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 за областта на действие на функцията.