debug_zval_dump

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

debug_zval_dumpExtrait une représentation sous forme de chaîne de la structure interne d'une zval pour affichage

Description

debug_zval_dump(mixed $value, mixed ...$values): void

Extrait une représentation sous forme de chaîne de caractères d'une structure interne d'une zval (Zend value) pour affichage. Ceci est généralement utile pour comprendre ou déboguer les détails d'implémentation du moteur Zend ou d'extensions PHP.

Liste de paramètres

value

La variable ou valeur à extraire.

values

Variables ou valeurs supplémentaires à extraire.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec debug_zval_dump()

<?php
$var1
= 'Hello';
$var1 .= ' World';
$var2 = $var1;

debug_zval_dump($var1);
?>

L'exemple ci-dessus va afficher :

string(11) "Hello World" refcount(3)

Note: Comprendre le refcount

La valeur refcount affichée par cette fonction peut être surprenante sans une compréhension détaillée 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ée "copy on write", où plusieurs variables tenant la même valeur pointent à la même copie en mémoire. Quand une de ces variables est modifiée, 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ées ou passées par référence (voir Références Expliquées). Ce refcount est stocké 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 faite ; 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ées par référence. Pour illustrer ceci, considérons une version légèrement modifiée de l'exemple ci-dessus :

<?php
$var1
= 'Hello';
$var1 .= ' World';
// Pointe trois variables en tant que référence à la même valeur
$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és en tant que référence, seule la valeur est passé à debug_zval_dump(). Cette valeur est utilisée une seule 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émentaires émergent à cause des optimisations effectuées par le moteur pour différents types de données. Certains types tels que les entiers n'utilisent pas "copy on write", et donc n'affichent aucun refcount. Dans d'autres cas, le refcount montre d'autres copies utilisées en interne, tels que quand une chaîne littérale ou tableau est stocké comme une partie d'une instruction de code

Voir aussi

add a note

User Contributed Notes 1 note

up
1
Hayley Watson
6 years ago
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.
To Top