Es wurde auf der Seite des nicht eingestellten Handbuchs im Jahr 2009 erwähnt :
unset()
macht genau das, was sein Name sagt - eine Variable deaktivieren. Es erzwingt keine sofortige Speicherfreigabe. Der Garbage Collector von PHP wird dies tun, wenn es passt - absichtlich, sobald diese CPU-Zyklen ohnehin nicht benötigt werden oder erst, wenn dem Skript der Speicherplatz ausgeht, was zuerst passiert.
Wenn Sie dies tun $whatever = null;
, schreiben Sie die Daten der Variablen neu. Möglicherweise wird Speicher schneller freigegeben / verkleinert, aber möglicherweise werden CPU-Zyklen aus dem Code gestohlen, der sie wirklich früher benötigt, was zu einer längeren Gesamtausführungszeit führt.
(Seit 2013 enthält diese unset
Manpage diesen Abschnitt nicht mehr.)
Beachten Sie, dass bis php5.3, wenn Sie zwei Objekte in Zirkelreferenz haben , z. B. in einer Eltern-Kind-Beziehung, der Aufruf von unset () für das übergeordnete Objekt den für die übergeordnete Referenz im untergeordneten Objekt verwendeten Speicher nicht freigibt . (Der Speicher wird auch nicht freigegeben, wenn das übergeordnete Objekt durch Müll gesammelt wird.) ( Fehler 33595 )
Die Frage " Unterschied zwischen nicht gesetzt und = null " beschreibt einige Unterschiede:
unset($a)
wird auch $a
aus der Symboltabelle entfernt; beispielsweise:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Ausgänge:
Notice: Undefined variable: a in xxx
NULL
Aber wann $a = null
wird verwendet:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Es scheint, dass dies $a = null
etwas schneller ist als das unset()
Gegenstück: Das Aktualisieren eines Symboltabelleneintrags scheint schneller zu sein als das Entfernen.
- Wenn Sie versuchen, eine nicht vorhandene (
unset
) Variable zu verwenden, wird ein Fehler ausgelöst und der Wert für den Variablenausdruck ist null. (Denn was sollte PHP sonst noch tun? Jeder Ausdruck muss einen Wert ergeben.)
- Eine Variable, der Null zugewiesen ist, ist jedoch immer noch eine völlig normale Variable.
$whatever
auf ein Objekt gezeigt wird,$whatever = null
der Zeiger und nicht das Objekt selbst überschrieben wird, sodass er im Wesentlichen genauso funktioniert wieunset()
.