"Fatal error: Call-time pass-by-reference has been removed ..." since PHP 5.something. So the Example #1 is now invalid PHP code.
(PHP 4 >= 4.2.0, PHP 5, PHP 7)
debug_zval_dump — Extrait une représentation sous forme de chaîne d'une valeur interne à Zend pour affichage
Extrait une représentation sous forme de chaîne d'une valeur interne à Zend pour affichage.
value
La variable à afficher.
values
Variables supplémentaire à afficher.
Aucune valeur n'est retournée.
Exemple #1 Exemple avec debug_zval_dump()
<?php
$var1 = 'Bonjour le monde !';
$var2 = '';
$var2 =& $var1;
debug_zval_dump(&$var1);
?>
L'exemple ci-dessus va afficher :
&string(18) "Bonjour le monde !" refcount(3)
Note: 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 unrefcount
de2
. 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é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
de1
est passée (par copie/valeur) :
<?php
$var1 = 'Bonjour le monde !';
debug_zval_dump($var1);
?>L'exemple ci-dessus va afficher :
string(18) "Bonjour le monde !" refcount(2)Un
refcount
de2
, 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, lerefcount
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.
"Fatal error: Call-time pass-by-reference has been removed ..." since PHP 5.something. So the Example #1 is now invalid PHP code.
Actual Output debug_zval_dump()
example :1
$var1 = 'Hello World';
$var2 = '';
$var2 =& $var1;
debug_zval_dump("&$var1"); //output : string(12) "&Hello World" refcount(1)
debug_zval_dump($var1); //output : string(11) "Hello World" refcount(3)
debug_zval_dump(&$var1); //output : Parse error: syntax error, unexpected '&' i
example :2
$var1 = 'Hello World';
debug_zval_dump($var1);//string(11) "Hello World" refcount(3)
example : 3
$var1 = 'Hello World';
$var2 = 'who';
$var2 =& $var1;
debug_zval_dump($var1); //output ://string(11) "Hello World" refcount(3)
The add of "Call-time pass-by-reference" as E_DEPRECATED makes it impossible to get the real refcount without getting an error, since <?php error_reporting(E_ALL ^ E_DEPRECATED); ?> and even <?php @debug_zval_dump(&$foo); ?> doesn't change anything.
If you're finding the interpretation of refcount confusing, the Xdebug extension offers a function similar to this one, but because the variable name is passed as a string, xdebug_debug_zval() doesn't scribble on the refcount with its own references to the zval.