2010-11-16 19 views
5

Je viens d'exécuter des tests de débogage simples sur des tableaux, et j'ai remarqué que lorsque je fais un var_dump() d'un tableau, la sortie signale tout élément du tableau qui est référencé par une autre variable. Comme une expérience simple, je courais le code suivant:Observation inattendue: var_dump() d'un tableau signale les éléments référencés ... depuis quand?

$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 />'; 

qui donne le résultat suivant:

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) } 

Notez le symbole ∫ à côté de l'élément 3 et ensuite l'élément 1. Notez également que les entrées n » t montre le type de données de l'entrée. Après quelques expérimentations, je ne vois pas ceci si je var_dump un type scalaire, ou avec des objets ou des ressources. Si le tableau contient des données de chaîne, le symbole est & (et il affiche toujours le type de données), de même que float, boolean et les entrées d'objet.

C'est en cours d'exécution contre PHP 5.2.8

Première question: Quand est-ce début de comportement, ou est-ce quelque chose que j'ai tout simplement pas remarqué avant? Deuxième question: Si les éléments référencés peuvent être marqués de cette manière par var_dump(), y a-t-il une fonction dans le noyau PHP qui me permettra d'identifier si un élément du tableau est référencé par une autre variable; ou qui va retourner le drapeau refcount ou ref d'un _zval_struct?

Répondre

4

Je ne sais pas si cela répond à votre question, mais vous pouvez utiliser

debug_zval_dump($array); 

pour obtenir le refcount:

array(4) refcount(2){ 
    [0]=> long(1) refcount(1) 
    [1]=> &long(2) refcount(2) 
    [2]=> long(3) refcount(1) 
    [3]=> &long(4) refcount(2) 
} 

Voir aussi ce Article by Derick Rethans (PHP Core Dev) about Refcounting.