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.