International PHP Conference Berlin 2025

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ère d'un 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 où valeur à extraire.

values

Variables ou valeurs supplémentaire à 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é 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

Voir aussi

add a note

User Contributed Notes 1 note

up
3
Hayley Watson
5 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