He estado ejecutando algunas pruebas simples de depuración contra matrices, y he notado que cuando hago un var_dump() de una matriz, la salida marca cualquier elemento en la matriz a la que hace referencia otra variable. Como un experimento sencillo, me encontré con el siguiente código:Observación inesperada: var_dump() de una matriz está marcando elementos referenciados ... ¿desde cuándo?
$array = range(1,4);
var_dump($array);
echo '<br />';
foreach($array as &$value) {
}
var_dump($array);
echo '<br />';
$value2 = &$array[1];
var_dump($array);
echo '<br />';
que da el siguiente resultado:
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> ∫(4) }
array(4) { [0]=> int(1) [1]=> ∫(2) [2]=> int(3) [3]=> ∫(4) }
Nota el símbolo ∫ junto con el elemento 3 y, posteriormente, el elemento 1. Tenga en cuenta también que esas entradas don' t muestra el tipo de datos de la entrada.
Después de algunos experimentos, no veo esto si var_dump un tipo escalar, o con objetos o recursos. Si la matriz contiene datos de cadena, el símbolo es & (y todavía muestra el tipo de datos), del mismo modo con las entradas float, boolean y object.
Esto se está ejecutando en PHP 5.2.8
Primera pregunta: ¿Cuándo comenzó esta conducta, o es algo que simplemente no he dado cuenta antes?
Segunda pregunta: Si los elementos mencionados se pueden marcar de esta manera por var_dump(), ¿hay alguna función en PHP núcleo que me permitirá identificar si un elemento de matriz es referenciado por otra variable; ¿O que devolverá la bandera de refcount o ref de una _zval_struct?