Faites attention avec refcount :
La valeur refcount retournée par cette fonction n'est pas
significative dans certaines circonstances. Par exemple, un développeur
peut s'attendre avec l'exemple ci-dessus d'avoir un refcount
de 2. La troisième référence est créée lors de l'appel à la
fonction debug_zval_dump().
Ce comportement est encore plus fin lorsqu'une variable n'est pas passée
par référence à la fonction debug_zval_dump(). Pour illustrer
ceci, voici une version modifiée de l'exemple ci-dessus :
Exemple 2.
<?php $var1 = 'Bonjour le monde !'; $var2 = '';
$var2 =& $var1;
debug_zval_dump($var1); // non passée par référence, cette fois-ci ?>
|
L'exemple ci-dessus va afficher : string(18) "Bonjour le monde !" refcount(1) |
|
Pourquoi refcount(1) ? Parce qu'une copie de $var1 a
été faite, lors de l'appel de la fonction.
Cette fonction devient encore plus confuse lorsqu'une
variable avec un refcount de 1 est
passée (par copie/valeur) :
Exemple 3.
<?php $var1 = 'Bonjour le monde !';
debug_zval_dump($var1); ?>
|
L'exemple ci-dessus va afficher : string(18) "Bonjour le monde !" refcount(2) |
|
Un refcount de 2, ici, est vraiment
inattendu. Tout spécialement si on considère les exemples ci-dessus. Donc, que
se passe-t-il ?
Lorsqu'une variable a une seule référence (faire $var1
avant qu'elle ne soit utilisée en tant qu'argument de la fonction
debug_zval_dump()), le moteur PHP optimise
la façon dont elle est passée à la fonction. En interne, PHP traite
$var1 comme une référence (et donc, le refcount
est incrémenté), et avec le cas où le passage par référence intervient, une copie est alors
faite, mais uniquement au moment de l'écriture. Ceci est connu comme "la copie à l'écriture".
Donc, si debug_zval_dump() intervient pour écrire son unique paramètre
(et il ne le fait pas), alors une copie est faite. Jusque-là , le paramètre demeure
une référence, faisant que le refcount est incrémenté
à 2 pour l'appel à la fonction.