| Faîte 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 :
|
<?php $var1 = 'Bonjour le monde !'; $var2 = '';
$var2 =& $var1;
debug_zval_dump($var1); // non passé par référence, cette fois-ci ?>
|
Pourquoi
refcount(1)
? Parcequ'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) :
|
<?php $var1 = 'Bonjour le monde !';
debug_zval_dump($var1); ?>
|
Un
refcount
de
2
, ici, est vraiment
innatendu. 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é en tant qu'argument à 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.
|