unset()
Die Funktion unset() ist eine eingebaute PHP-Funktion, die eine Variable oder ein Array-Element entfernt und Speicher freigibt.
Einführung
Die Funktion unset() ist eine eingebaute PHP-Funktion, die eine Variable oder ein Element eines Arrays vernichtet. Sobald eine Variable mit unset() entfernt wurde, existiert sie nicht mehr — ein erneuter Zugriff darauf verhält sich genau so, als wäre sie nie deklariert worden.
Diese Seite behandelt die Syntax von unset(), das Verhalten bei Arrays, Referenzen, Objekteigenschaften und Variablen innerhalb von Funktionen sowie den Unterschied zur einfachen Zuweisung von null. Wenn Sie diese Unterschiede kennen, schreiben Sie vorhersehbaren Code und vermeiden die häufigsten Fallstricke mit unset().
Ein wichtiger Punkt vorab: unset() entfernt den Namen (die Variablenbindung), nicht zwingend den zugrunde liegenden Wert. PHP gibt den Speicher des Werts automatisch durch Reference-Counting und den Garbage Collector frei, sobald keine andere Referenz mehr darauf zeigt — nicht genau in dem Moment, in dem Sie unset() aufrufen.
Syntax
unset(mixed $var, mixed ...$vars): voidDie Funktion nimmt eine oder mehrere Variablen (durch Kommas getrennt) entgegen und gibt nichts zurück (void). Jedes Argument ist die Variable oder das Array-Element, das vernichtet werden soll.
<?php
$a = 1;
$b = 2;
$c = 3;
unset($a, $b, $c); // destroy several variables in one call
?>Ein Array-Element entfernen
Die häufigste Verwendung von unset() ist das Löschen eines Elements aus einem Array über seinen Schlüssel:
Beispiel für PHP unset()
Hier entfernen wir das Element am Index 1 ("banana"). Die Ausgabe lautet:
Array
(
[0] => apple
[2] => cherry
)Beachten Sie, dass unset() das Array nicht neu indiziert — die verbleibenden Schlüssel bleiben 0 und 2, sodass eine „Lücke" entsteht. Dies ist die häufigste Überraschung bei unset(). Wenn Sie eine saubere, sequenziell neu indizierte Liste (0, 1, 2, …) benötigen, übergeben Sie das Ergebnis an array_values():
<?php
$array = ["apple", "banana", "cherry"];
unset($array[1]);
$array = array_values($array);
print_r($array);
?>Array
(
[0] => apple
[1] => cherry
)Eine eigenständige Variable vernichten
Wird unset() auf eine einfache Variable angewendet, entfernt es sie vollständig. Danach wird die Variable als undefiniert behandelt:
<?php
$name = "John";
unset($name);
echo $name ?? "Variable is unset"; // Outputs: Variable is unset
?>Der Null-Coalescing-Operator ?? ist die sichere Methode, um eine möglicherweise nicht mehr vorhandene Variable zu lesen, da er keine Warnung „Undefined variable" auslöst. Mit isset() lässt sich ebenfalls prüfen, ob eine Variable noch existiert.
unset() vs. Zuweisung von null
Diese beiden Vorgehensweisen sehen ähnlich aus, sind aber nicht dasselbe:
<?php
$x = 5;
$y = 5;
unset($x); // $x no longer exists
$y = null; // $y still exists, its value is null
var_dump(isset($x)); // bool(false) — the variable is gone
var_dump(isset($y)); // bool(false) — isset() returns false for null too
var_dump(array_key_exists('y', get_defined_vars())); // bool(true) — $y is still defined
?>Verwenden Sie unset(), wenn die Variable (oder der Array-Schlüssel) nicht mehr existieren soll. Weisen Sie null zu, wenn Sie die Variable behalten, aber ihren Wert leeren möchten. Beachten Sie, dass isset() in beiden Fällen false zurückgibt. Um sie zu unterscheiden, müssen Sie direkt auf das Vorhandensein des Schlüssels prüfen. Weitere verwandte Prüfungen finden Sie unter is_null() und empty().
unset() innerhalb einer Funktion
Das Verhalten von unset() hängt vom Gültigkeitsbereich der Variable ab, was viele Entwickler überrascht:
<?php
function destroy_local() {
$value = 10;
unset($value); // only the local copy is destroyed
echo $value ?? "local is unset"; // Outputs: local is unset
}
destroy_local();
?>Wenn Sie eine per Referenz übergebene Variable mit unset() entfernen, wird nur die lokale Referenz aufgehoben — die Variable des Aufrufers bleibt unberührt:
<?php
function destroy_ref(&$ref) {
unset($ref); // breaks the local binding, not the original
}
$data = "keep me";
destroy_ref($data);
echo $data; // Outputs: keep me
?>Wenn eine Funktion tatsächlich eine Variable aus dem aufrufenden Gültigkeitsbereich entfernen soll, übergeben Sie sie als referenziertes Array-Element oder verwenden Sie eine globale Variable — in den meisten Fällen ist es jedoch sauberer, den Code so umzugestalten, dass ein Wert zurückgegeben wird. Weitere Informationen zu Gültigkeitsbereichsregeln finden Sie unter Variables Scope.
Objekteigenschaften entfernen
unset() entfernt auch eine Eigenschaft aus einer Objektinstanz:
<?php
$user = new stdClass();
$user->name = "Ann";
$user->role = "admin";
unset($user->role);
var_dump(isset($user->role)); // bool(false)
print_r($user);
?>bool(false)
stdClass Object
(
[name] => Ann
)Der foreach-Referenz-Fallstrick
Ein klassischer Fehler: Nach dem Iterieren eines Arrays mit einer Referenz (&$value) zeigt die Referenzvariable noch auf das letzte Element. Eine spätere Wiederverwendung kann das Array still und heimlich korrumpieren. Die Lösung besteht darin, die Referenz unmittelbar nach der Schleife mit unset() zu entfernen:
<?php
$items = [1, 2, 3];
foreach ($items as &$value) {
$value *= 2;
}
unset($value); // break the dangling reference — do this every time
print_r($items);
?>Array
(
[0] => 2
[1] => 4
[2] => 6
)Fazit
unset() vernichtet Variablen, Array-Elemente und Objekteigenschaften und entfernt die Bindung, sodass der Name nicht mehr existiert. Behalten Sie diese Punkte im Kopf:
- Es entfernt den Namen, nicht zwingend den Wert — der Speicher wird durch PHPs Reference-Counting und Garbage Collector freigegeben.
- Das Entfernen eines Array-Elements hinterlässt eine Lücke; verwenden Sie
array_values()zur Neuindizierung. - Es ist nicht dasselbe wie das Zuweisen von
null;unset()lässt die Variable aufhören zu existieren. - Innerhalb von Funktionen respektiert es den Gültigkeitsbereich, und das Entfernen eines per Referenz übergebenen Parameters bricht nur die lokale Bindung.
- Verwenden Sie nach einer
foreach ... as &$value-Schleife stetsunset()für die Schleifenvariable.
Weitere Informationen zur Arbeit mit den Daten, auf die unset() angewendet wird, finden Sie unter PHP Variables und PHP Arrays.