Nota:
Comprender el refcount
El valor refcount
mostrado por esta función puede resultar sorprendente sin una comprensión detallada de la implementación del motor.
El motor Zend utiliza el conteo de referencias por dos razones diferentes:
-
Optimizar el uso de memoria utilizando una técnica llamada "copy on write", donde múltiples variables que contienen el mismo valor apuntan a la misma copia en memoria. Cuando una de estas variables es modificada, apunta a una nueva copia en memoria, y el conteo de referencias del original se reduce en 1.
-
El seguimiento de variables que han sido asignadas o pasadas por referencia (ver Referencias explicadas). Este refcount se almacena en una zval de referencia separada, apuntando a la zval para el valor actual. Esta zval adicional no se muestra actualmente por debug_zval_dump().
Como debug_zval_dump() toma su entrada como un parámetro normal, pasado por valor, la técnica de copy on write será utilizada para el paso: en lugar de copiar los datos, el refcount será incrementado en 1 durante la vida del llamado a la función. Si la función modifica el parámetro después de haberlo recibido, entonces se realizará una copia; como no lo hace, mostrará un refcount 1 más alto que en el ámbito de llamada.
El paso de parámetros también impide que debug_zval_dump() muestre variables que han sido asignadas por referencia. Para ilustrar esto, considere una versión ligeramente modificada del ejemplo anterior:
Aunque $var1, $var2 y $var3 están vinculadas como referencia, solo el valor es pasado a debug_zval_dump(). Este valor es utilizado una sola vez por el conjunto de referencias, y una vez dentro de debug_zval_dump(), por lo que muestra un refcount de 2.
Complicaciones adicionales emergen debido a las optimizaciones realizadas por el motor para diferentes tipos de datos. Algunos tipos como los enteros no utilizan "copy on write", y por lo tanto no muestran ningún refcount. En otros casos, el refcount muestra otras copias utilizadas internamente, como cuando una cadena literal o un array es almacenado como parte de una instrucción de código.