(PHP 4 >= 4.2.0, PHP 5)
debug_zval_dump — Vuelca a la salida una cadena con la representación de un valor interno de zend
Volcar a la salida una cadena con la representación de un valor interno de zend.
variable
La variable a ser evaluada
No devuelve ningún valor.
Ejemplo #1 Ejemplo debug_zval_dump()
<?php
$var1 = 'Hola Mundo';
$var2 = '';
$var2 =& $var1;
debug_zval_dump(&$var1);
?>
El resultado del ejemplo sería:
&string(11) "Hola Mundo" refcount(3)
Nota: Cuidado con refcount
El valor refcount devuelto por esta función no es evidente en determinadas circunstancias. Por ejemplo, un desarrollador puede esperar que el ejemplo anterior indique un refcount de 2. La tercera referencia se crea cuando se realiza la llamada a debug_zval_dump().
Este comportamiento se agrava aún más cuando una variable no se pasa a debug_zval_dump() por referencia. Para ilustrar esto, considere una versión ligeramente modificada del ejemplo anterior:
<?php
$var1 = 'Hola Mundo';
$var2 = '';
$var2 =& $var1;
debug_zval_dump($var1); // esta vez, no pasada por referencia
?>El resultado del ejemplo sería:
string(11) "Hola Mundo" refcount(1)Por qué refcount(1)? Porque una copia de $var1 es realizada, cuando se llama a la función.
Esta función se hace aún más confusa cuando una variable con un refcount de 1 es pasada (por copia/valor):
<?php
$var1 = 'Hola Mundo';
debug_zval_dump($var1);
?>El resultado del ejemplo sería:
string(11) "Hola Mundo" refcount(2)Un refcount de 2, aquí, no es extremedamente evidente. Especialmente teniendo en cuenta los ejemplos anteriores. ¿Qué ha ocurrido?
Cuando una variable tiene una sola referencia (como ocurría con $var1 antes de que fuera utilizada como un argumento para debug_zval_dump()), el motor de PHP optimiza la manera en que se pasa a una función. Internamente, PHP trata $var1 como una referencia (en esa refcount se incrementa para el ámbito de esa función), con la salvedad de que si la referencia pasa a ser aprobada por escrito y, una copia es realizada, pero sólo en el momento de la escritura. Esto se conoce como "copiar al escribir."
Así que, si debug_zval_dump() pasa a escribir en su único parámetro (y no lo hace), es entonces cuando se haría una copia. Hasta entonces, el parámetro sigue siendo una referencia, haciendo que refcount sea incrementado a 2 en el ámbito de la función llamada.