Note:
Comprendre le refcount
La valeur refcount
affiché par cette fonction peut être
surprenant sans une compréhension détaillé de l'implémentation du moteur.
Le moteur Zend utilise le comptage de référence pour deux raisons
différentes :
-
Optimiser l'usage de mémoire en utilisant une technique appelé
"copy on write", où plusieurs variables tenant la même valeur pointe
à la même copie en mémoire. Quand une de ces variables est modifié,
elle pointe à une nouvelle copie en mémoire, et le comptage de référence
de l'originale est réduit de 1.
-
Le pistage des variables qui ont été assigné ou passé par référence (voir
Références Expliquer). Ce
refcount est stocker dans un zval de référence séparé, pointant à la zval
pour la valeur actuelle. Cette zval additionnelle n'est actuellement pas
montré par debug_zval_dump().
Car debug_zval_dump() prend son entrée comme un
paramètre normal, passé par valeur, la technique de copy on write sera
utilisé pour la passé: au lieu de copier les données, le refcount sera
incrémenté de 1 pour la durée de vie de l'appel de la fonction. Si la
fonction modifie le paramètre après l'avoir reçu, alors une copie sera
fait ; comme elle n'en fait pas, elle affichera un refcount de 1 plus
élevé que dans la portée d'appel.
Le passage de paramètre empêche aussi debug_zval_dump()
de montrer les variables qui ont été assigné par référence. Pour illustrer
ceci, considérons une version légèrement modifié de l'exemple ci-dessus :
showing variables which have been assigned by reference. To illustrate,
consider a slightly modified version of the above example:
<?php
$var1 = 'Hello';
$var1 .= ' World';
// Point three variables as references to the same value
$var2 =& $var1;
$var3 =& $var1;
debug_zval_dump($var1);
?>
L'exemple ci-dessus va afficher :
string(11) "Hello World" refcount(2)
Bien que $var1, $var2, et
$var3 sont lié en tant que référence, seul la
valeur est passé à debug_zval_dump().
Cette valeur est utilisé une seul fois par le jeu de références, et une
fois à l'intérieur de debug_zval_dump(), ainsi
il affiche un refcount de 2.
Des complications supplémentaire émergent à cause des optimisations
effectué par le moteur pour différent types de données. Certains types tel
que les entiers n'utilise pas "copy on write", et donc n'affiche aucun
refcount. Dans d'autre cas, le refcount montre d'autres copies utilisé
en interne, tel que quand une chaîne littérale ou tableau est stocké comme
une partie d'une instruction de code