php - lista - La variable se refiere a sí misma.
lista de comandos php (1)
Leí muchos artículos sobre cómo construir las variables dentro de la máquina Zend y encontré una cosa interesante que no puedo explicar:
$int = 100;
xdebug_debug_zval(''int''); /// int:(refcount=1,is_ref=0),int 100
$int = &$int;
xdebug_debug_zval(''int''); /// int:(refcount=1,is_ref=1),int 100
Como resulta que estamos creando el enlace a sí mismo? ¿Como es posible?
Información clara de lo que sé:
Como regla, is_ref = 1
solo cuando el contenedor hace referencia a zval dos o más variables de enlace duro.
refcount
: es el número de variables que se refieren al mismo contenedor zval, pero la diferencia es que refcount para diferentes trabajos con is_ref = 0
y is_ref = 1
.
Si is_ref = 0
, y refcount > 1
al crear enlaces duros, obtendremos un nuevo contenedor zval, si hacemos la asignación por un valor, no se creará un nuevo contenedor zval.
Si is_ref = 1
, y refcount > 1
cuando se crean enlaces duros, no se crea nuevo zval, se usa antiguo. Si no creamos un enlace fijo, pero si lo asignamos por un valor, significa lo que creamos el nuevo contenedor zval.
PD: escribí esto para demostrar que entiendo que pregunto y mostrar por qué no entiendo el comportamiento del código que he escrito anteriormente.
La respuesta es bastante simple, como se explica en los comentarios a su pregunta. Sin embargo, creo que entiendo de dónde viene tu confusión, así que analicemos esto. :RE
Primero, asigna un valor a una variable, PHP internamente lo almacena en un segmento de memoria y aumenta el contador de variables que se refiere a esta dirección. (Recuento de ref = 1). Todo recto hasta este punto.
Luego, reutiliza la variable para almacenar una referencia (puntero en términos C) a esta dirección de memoria. El manual de PHP explica esto como el almacenamiento de una referencia a una variable, para facilitar las cosas a los programadores que no son de C, que es de donde (creo) proviene la confusión. No hay tal cosa como una referencia a una variable en las partes internas, solo los datos a los que la variable está vinculada. Dado que reutilizó la variable para almacenar esta referencia, el recuento de referencias no aumenta: todavía hay una sola variable que apunta a este segmento de memoria. Sin embargo, ya no es una variable PHP normal, sino una referencia (puntero) a los datos.
Edición, añadido:
Otra forma de lograr el mismo resultado es usar dos variables y luego unset
la primera. Ejemplo de código:
$a = 100; // refcount += 1
xdebug_debug_zval (''a''); // refcount=1,is_ref=0 -> zval {value=100,type=int (addr=0x78765asd)}
$b =& $a; // refcount += 1
xdebug_debug_zval (''a'') // refcount=2,is_ref=0 -> zval {value=100,type=int (addr=0x78765asd)}
xdebug_debug_zval (''b'') // refcount=2,is_ref=1 -> zval {value=100,type=int (addr=0x78765asd)}
unset ($a); // refcount -= 1
xdebug_debug_zval (''b'') // refcount=1,is_ref=1 -> zval {value=100,type=int (addr=0x78765asd)}
El uso de una sola variable combina las dos operaciones en una, sin destruir los datos. Por lo tanto: 1 variable (refcount = 1), que es una referencia (is_ref = 1) a los datos en sí.
Como hemos intentado explicarle, la confusión se debe al hecho de que la premisa detrás de la pregunta original es errónea: en estos ejemplos no hace referencia a una variable , hace referencia a un área de la memoria que contiene los datos asociados originalmente. con dicha variable. Entonces estás sobrescribiendo uno (el original) "enlace duro", con otro. La única diferencia es que este último está marcado como tal, por razones internas de PHP. (Las referencias no se copian en escritura, en el caso de refcounts> 1).