get_defined_vars()
Die Funktion get_defined_vars() gibt ein assoziatives Array aller im aktuellen Gültigkeitsbereich definierten Variablen zurück.
Einführung
get_defined_vars() ist eine in PHP eingebaute Funktion, die ein assoziatives array aller Variablen zurückgibt, die im Gültigkeitsbereich, in dem sie aufgerufen wird, existieren. Die array-Schlüssel sind die Variablennamen (ohne das führende $), und die Werte sind die aktuellen Werte der Variablen.
Der wichtigste Gedanke ist der Gültigkeitsbereich (Scope). Ein „Scope" ist der Codebereich, in dem eine Variable sichtbar ist. PHP kennt den Funktions-Scope (Variablen innerhalb einer Funktion) und den globalen Scope (Variablen auf der obersten Ebene eines Skripts). get_defined_vars() meldet nur das, was an der genauen Stelle sichtbar ist, an der man sie aufruft – das macht sie zu einer schnellen Möglichkeit, den Zustand zum Debuggen zu erfassen, ohne jede Variable einzeln benennen zu müssen.
Diese Seite behandelt die Syntax, was die Funktion enthält und was nicht, wie sich das Ergebnis je nach Scope ändert und die häufigsten praktischen Anwendungsfälle.
Syntax
get_defined_vars(): arrayDie Funktion nimmt keine Argumente entgegen und gibt immer ein array zurück. Sind im aktuellen Scope keine Variablen definiert, gibt sie ein leeres array zurück.
Einfaches Beispiel
Der einfachste Fall ist der Aufruf im globalen Scope, unmittelbar nach der Definition einiger Variablen:
<?php
$name = "Ada";
$age = 36;
$colors = ["red", "green"];
print_r(get_defined_vars());
?>Die benutzerdefinierten Variablen erscheinen als Schlüssel (zusammen mit den Superglobals von PHP, die weiter unten erläutert werden):
Array
(
[name] => Ada
[age] => 36
[colors] => Array
(
[0] => red
[1] => green
)
...
)Der Scope ist entscheidend: lokal vs. global
Dies ist der Punkt, der häufig zu Verwirrung führt. get_defined_vars() sieht nicht über Scope-Grenzen hinweg. Eine Funktion kann die globalen Variablen des Skripts nicht sehen, sofern sie nicht importiert wurden (z. B. mit dem Schlüsselwort global oder als Argumente übergeben wurden). Ein Aufruf von get_defined_vars() innerhalb einer Funktion meldet daher nur die eigenen Variablen dieser Funktion.
Innerhalb der Funktion ist nur die lokale Variable sichtbar, die Ausgabe lautet daher:
Array
(
[var3] => 1
)Das globale $var1 und $var2 werden nicht aufgeführt, weil sie zu einem anderen Scope gehören. (true wird als 1 ausgegeben, weil PHP den boolean true in print_r so darstellt.)
Was ist mit Superglobals?
Ein häufiges Missverständnis ist, dass get_defined_vars() immer die Superglobals ($_GET, $_POST, $_SERVER usw.) zurückgibt. Das ist nicht der Fall. Superglobals werden nur zurückgegeben, wenn die Funktion im globalen Scope aufgerufen wird, weil sie dort beheimatet sind. Innerhalb einer Funktion sind sie zwar unter ihrem Namen zugänglich, gehören aber nicht zu diesem lokalen Scope und erscheinen daher nicht im obigen Ergebnis. Dasselbe gilt für $GLOBALS – es ist nicht im zurückgegebenen array enthalten.
Häufige Anwendungsfälle
Prüfen, ob eine Variable definiert ist
Da das Ergebnis ein einfaches array ist, kann man mit array_key_exists() prüfen, ob eine Variable existiert. Das ist praktisch, wenn eine Variable nur auf manchen Codepfaden gesetzt wird:
<?php
$config = "loaded";
$vars = get_defined_vars();
var_dump(array_key_exists("config", $vars)); // bool(true)
var_dump(array_key_exists("missing", $vars)); // bool(false)
?>Um eine einzelne bekannte Variable zu prüfen, ist isset() meist klarer; get_defined_vars() glänzt, wenn man das vollständige Bild auf einmal möchte.
Den Zustand innerhalb einer Funktion debuggen
Füge einen einzigen Aufruf nahe einer kniffligen Zeile ein, um alle lokalen Variablen und ihre Werte zu sehen, anstatt für jede einzeln ein var_dump() zu schreiben:
<?php
function calculatePrice($base, $taxRate) {
$tax = $base * $taxRate;
$total = $base + $tax;
print_r(get_defined_vars());
return $total;
}
calculatePrice(100, 0.2);
?>Der Snapshot zeigt die Argumente und alle lokalen Variablen auf dem Weg dorthin:
Array
(
[base] => 100
[taxRate] => 0.2
[tax] => 20
[total] => 120
)Verwandte Funktionen
| Funktion | Verwende sie, wenn du… |
|---|---|
compact() | Ein array aus ausgewählten Variablennamen erstellen möchtest. |
extract() | Das Gegenteil tun möchtest – die Schlüssel eines arrays wieder in Variablen umwandeln. |
isset() | Prüfen möchtest, ob eine bestimmte Variable gesetzt und nicht null ist. |
Siehe auch Gültigkeitsbereiche von Variablen für die Regeln, die bestimmen, was get_defined_vars() sehen kann, und PHP-Superglobals dafür, warum sie nur im globalen Scope erscheinen.
Fazit
get_defined_vars() liefert einen einzeiligen Snapshot aller Variablen, die im aktuellen Scope sichtbar sind. Das macht sie zu einem schnellen Debugging-Hilfsmittel und einer einfachen Möglichkeit, den Zustand programmatisch zu prüfen. Die einzige Regel, die man im Kopf behalten muss, ist der Scope: Innerhalb einer Funktion sieht man nur die lokalen Variablen dieser Funktion (plus alles explizit Importierte), während man im globalen Scope auch die Superglobals von PHP sieht. Dieses Verständnis der Grenzen macht die Funktion vorhersehbar nutzbar.