W3docs

debug_zval_dump()

Die Funktion debug_zval_dump() gibt die interne Wertdarstellung einer PHP-Variable aus, einschließlich Referenzanzahl und Zend-Engine-Details.

Einführung

Die Funktion debug_zval_dump() ist eine eingebaute PHP-Funktion, die die interne Darstellung einer Variable so ausgibt, wie die Zend-Engine sie speichert – nicht nur ihren Wert, sondern auch ihren Referenzzähler (refcount) und ob sie eine Referenz (is_ref) ist. Damit bietet sie einen Einblick in PHPs Speicherverwaltung, insbesondere in die Copy-on-Write-Optimierung.

Ein zval ("Zend value") ist der C-seitige Container, den PHP für jede Variable verwendet. Mehrere Variablennamen können auf dasselbe zugrunde liegende zval zeigen; PHP erstellt erst eine physische Kopie, wenn eines davon geändert wird. Mit debug_zval_dump() lässt sich diese Buchhaltung beobachten.

Veraltet und entfernt. Diese Funktion wurde in PHP 7.2 als veraltet markiert und in PHP 8.0 entfernt. Sie läuft nur auf älteren PHP-Versionen (bis 7.4). Auf PHP 8+ existiert sie nicht – lesen Sie Moderne Alternativen unten, bevor Sie sie verwenden.

Wenn Sie lediglich den Typ und den Wert einer Variable prüfen möchten, verwenden Sie stattdessen var_dump() – diese Funktion funktioniert mit jeder PHP-Version und ist das alltägliche Debugging-Werkzeug.

Syntax

Die Syntax der Funktion debug_zval_dump() lautet wie folgt:

Die PHP-Syntax von debug_zval_dump()

void debug_zval_dump(mixed $variable, mixed ...$rest): void

Die Funktion akzeptiert eine oder mehrere Variablen und gibt die interne Darstellung jeder einzelnen aus. Sie gibt nichts zurück (void) – sie schreibt direkt in den Ausgabestream. Jede Zeile der Ausgabe folgt dem Muster:

type(value) refcount(N)
  • type(value) — dieselbe Typ/Wert-Notation, die auch var_dump() verwendet, z. B. string(5) "hello", int(42).
  • refcount(N) — wie viele zval-Handles aktuell auf diesen Wert zeigen. Wenn is_ref gesetzt ist, gibt die Ausgabe zusätzlich is_ref=true aus.

Verwendungsbeispiel

Hier ist ein Beispiel, wie die Funktion debug_zval_dump() in PHP verwendet wird:

Beispiel für PHP debug_zval_dump()

php— editable, runs on the server

Hier ist $b per Referenz an $a gebunden, sodass beide Namen ein gemeinsames zval teilen, das als Referenz markiert ist. Der Aufruf von debug_zval_dump() auf beiden gibt denselben internen Wert aus:

string(5) "hello" refcount(3)
string(5) "hello" refcount(3)

Warum refcount 3 und nicht 2 ist. Man würde 2 erwarten (für $a und $b). Der zusätzliche Zähler stammt von debug_zval_dump() selbst: Das Übergeben der Variable an die Funktion fügt vorübergehend ein weiteres Handle zum zval hinzu, das gezählt wird, bevor der Wert ausgegeben wird. Dieses Off-by-one ist eine bekannte Eigenheit – lesen Sie den ausgegebenen Zähler relativ zu einem Ausgangswert und nicht als absolute Wahrheit.

Copy-on-Write beobachten

Die lehrreichere Verwendung ist das Beobachten, wie PHP einen Wert teilt und anschließend aufteilt. Einfache (nicht-referenzierte) Variablen teilen sich ein zval, bis eine von ihnen beschrieben wird:

<?php
$a = "hello";
debug_zval_dump($a);   // refcount(2): $a + the function argument

$b = $a;               // no copy yet — $a and $b share one zval
debug_zval_dump($a);   // refcount(3): $a, $b, and the argument

$b = "world";          // write triggers the copy ("copy-on-write")
debug_zval_dump($a);   // back to refcount(2): $b now has its own zval
?>

Der steigende refcount beim Zuweisen und der sinkende beim Ändern einer Kopie ist Copy-on-Write in Aktion – PHP vermied das Duplizieren des "hello"-Strings, bis es tatsächlich nötig war.

Fazit

Die Funktion debug_zval_dump() war historisch gesehen nützlich, um Referenzzähler und das Copy-on-Write-Verhalten der Zend-Engine zu untersuchen. Sie gibt den Typ, den Wert und den refcount/is_ref-Status einer Variable aus, was Entwicklern half, nachzuvollziehen, wann PHP tatsächlich Daten kopiert. Heute ist sie hauptsächlich von pädagogischem Interesse, da sie in PHP 8+ nicht mehr vorhanden ist.

Moderne Alternativen

Da debug_zval_dump() auf PHP 8+ nicht verfügbar ist, greifen Sie stattdessen auf folgende Funktionen zurück:

  • var_dump() — die Standardwahl zur Überprüfung des Typs und Werts einer beliebigen Variable. Verwenden Sie diese für das alltägliche Debugging.
  • print_r() — menschenlesbare Ausgabe für arrays und objects, optional als string zurückgegeben.
  • var_export() — gibt eine gültige PHP-Code-Darstellung aus, die Sie direkt in den Quellcode einfügen können.
  • gettype() — wenn Sie nur den Typnamen einer Variable benötigen.
  • xdebug_debug_zval() — der engste Ersatz für die Inspektion von Referenzzählern, verfügbar wenn die Xdebug-Erweiterung installiert ist.

Übung

Übung
Was macht die Funktion debug_zval_dump() in PHP?
Was macht die Funktion debug_zval_dump() in PHP?
Was this page helpful?