Signatur
Beschreibung
debug_zval_dump zeigt die interne Repräsentation einer PHP-Variable auf Ebene des Zend-Engine-zval-Containers an. Neben dem Typ und Wert der Variable werden der Referenz-Zähler (refcount) sowie – bei PHP < 7 – das is_ref-Flag ausgegeben. Das ist besonders nützlich, wenn man verstehen möchte, wie PHP Variablen intern verwaltet und wann Copy-on-Write greift.
Seit PHP 7 wurde das Speichermodell der Zend Engine grundlegend überarbeitet (zval enthält keine indirekten Heap-Zeiger mehr für skalare Typen), weshalb der refcount bei skalaren Werten häufig nicht erscheint oder 0 beträgt. Bei Objekten, Arrays und Strings mit Heap-Allokation wird er hingegen weiterhin angezeigt.
Die Funktion ist ausschließlich für Debugging-Zwecke gedacht und sollte niemals im produktiven Code eingesetzt werden. Im Gegensatz zu var_dump liefert sie tiefe Einblicke in das Speicher-Management, nicht nur in die logische Struktur der Daten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $values Pflicht | mixed | Eine oder mehrere Variablen oder Ausdrücke, deren interne zval-Struktur ausgegeben werden soll. Mehrere Werte werden der Reihe nach verarbeitet. |
Rückgabewert
Beispiele
Einfache skalare Variable und ihr refcount
<?php
$a = 'Hallo';
$b = $a; // Copy-on-Write: beide zeigen noch auf dasselbe zval
debug_zval_dump($a);
// refcount ist 2, da $a und $b denselben String teilen (PHP 5)
// In PHP 7+ entfällt der refcount bei internierten/kurzen Strings
unset($b);
debug_zval_dump($a);
// Nach unset($b) sinkt der refcount wieder auf 1
Objekt-Referenzzähler beobachten
<?php
class Punkt {
public function __construct(
public float $x = 0.0,
public float $y = 0.0
) {}
}
$p1 = new Punkt(3.0, 4.0);
$p2 = $p1; // Objekte werden als Handle übergeben — gleicher refcount
debug_zval_dump($p1);
// Zeigt: object(Punkt) refcount(2) { ... }
$p3 = clone $p1; // echtes Kopieren
debug_zval_dump($p1);
// Zeigt weiterhin refcount(2), $p3 ist unabhängig
Array und Copy-on-Write
<?php
$arr = [1, 2, 3];
$arr2 = $arr; // Copy-on-Write, kein echtes Kopieren
debug_zval_dump($arr);
// refcount(2), da $arr und $arr2 dasselbe Array-Backing teilen
$arr2[] = 4; // Schreibzugriff erzwingt echte Kopie
debug_zval_dump($arr);
// refcount(1), das ursprüngliche Array gehört nun nur noch $arr
// Wichtig · Fallstricke
Nur für Entwicklungsumgebungen: debug_zval_dump erzeugt unkontrollierte Ausgaben und ist kein Ersatz für strukturiertes Logging. Niemals in produktivem Code einsetzen.
Das Verhalten und die Ausgabe unterscheiden sich erheblich zwischen PHP 5 und PHP 7/8, da die Zend Engine in PHP 7 grundlegend umgebaut wurde (zval auf dem Stack statt auf dem Heap für Skalare). Skalare Werte (int, float, bool, null) haben in PHP 7+ keinen sichtbaren refcount mehr.
Achtung: Wird die Variable direkt als Ausdruck übergeben (z. B. debug_zval_dump($a + 1)), ist kein sinnvoller refcount sichtbar, da ein temporärer Wert ohne Referenz erzeugt wird.