PHP 8.5.0 Alpha 1 available for testing

debug_zval_dump

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

debug_zval_dumpExtrae una representación en forma de string de la estructura interna de una zval para su visualización

Descripción

debug_zval_dump(mixed $value, mixed ...$values): void

Extrae una representación en forma de string de una estructura interna de una zval (Zend value) para su visualización. Esto es generalmente útil para comprender o depurar los detalles de implementación del motor Zend o de extensiones PHP.

Parámetros

value

La variable o valor a extraer.

values

Variables o valores adicionales a extraer.

Valores devueltos

No devuelve ningún valor.

Ejemplos

Ejemplo #1 Ejemplo con debug_zval_dump()

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

debug_zval_dump($var1);
?>

El resultado del ejemplo sería:

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

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:

<?php
$var1
= 'Hello';
$var1 .= ' World';
// Apunta tres variables como referencia al mismo valor
$var2 =& $var1;
$var3 =& $var1;

debug_zval_dump($var1);
?>

El resultado del ejemplo sería:

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

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.

Ver también

add a note

User Contributed Notes 1 note

up
4
Hayley Watson
5 years ago
If you're finding the interpretation of refcount confusing, the Xdebug extension offers a function similar to this one, but because the variable name is passed as a string, xdebug_debug_zval() doesn't scribble on the refcount with its own references to the zval.
To Top