Start · Sprachen · PHP · Referenz · debug_zval_dump

debug_zval_dump

Funktion

Gibt eine detaillierte String-Darstellung der internen PHP-<code>zval</code>-Struktur einer oder mehrerer Variablen auf der Ausgabe aus.

seit PHP 4.2.0 Kategorie: type

Signatur

debug_zval_dump(mixed ...$values): void

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

Typ
void
Beschreibung
Die Funktion hat keinen Rückgabewert; die Ausgabe erfolgt direkt auf dem Standard-Ausgabekanal (Browser oder CLI).

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
string(5) "Hallo" refcount(2) string(5) "Hallo" refcount(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
object(Punkt)#1 (2) refcount(2) { ["x"]=> float(3) refcount(0) ["y"]=> float(4) refcount(0) } object(Punkt)#1 (2) refcount(2) { ["x"]=> float(3) refcount(0) ["y"]=> float(4) refcount(0) }

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
array(3) refcount(2) { [0]=> int(1) refcount(0) [1]=> int(2) refcount(0) [2]=> int(3) refcount(0) } array(3) refcount(1) { [0]=> int(1) refcount(0) [1]=> int(2) refcount(0) [2]=> int(3) refcount(0) }

// 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.