Zostało to wspomniane na stronie instrukcji unset w 2009 roku :
unset()robi dokładnie to, co mówi jego nazwa - odznacz zmienną. Nie wymusza natychmiastowego zwolnienia pamięci. Śmieciarka PHP zrobi to, gdy zobaczy pasowanie - z zamiarem, jak tylko te cykle procesora i tak nie będą potrzebne, lub tak późno, jak wcześniej skryptowi zabraknie pamięci, cokolwiek nastąpi wcześniej.
Jeśli to robisz $whatever = null;, przepisujesz dane zmiennej. Być może pamięć zostanie zwolniona / zmniejszona szybciej, ale może ukraść cykle procesora z kodu, który naprawdę ich potrzebuje wcześniej, co powoduje dłuższy całkowity czas wykonania.
(Od 2013 r. unsetTa strona podręcznika nie zawiera już tej sekcji)
Zauważ, że do php5.3, jeśli masz dwa obiekty w odwołaniu cyklicznym , takim jak relacja rodzic-dziecko, wywołanie unset () na obiekcie nadrzędnym nie zwolni pamięci używanej dla odwołania rodzica w obiekcie potomnym. (Pamięć nie zostanie również zwolniona, gdy obiekt nadrzędny zostanie wyrzucony do pamięci). ( Błąd 33595 )
Pytanie „ różnica między unset a = null ” wyszczególnia niektóre różnice:
unset($a)usuwa również $az tablicy symboli; na przykład:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Wyjścia:
Notice: Undefined variable: a in xxx
NULL
Ale kiedy $a = nulljest używany:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Wygląda na $a = nullto, że jest nieco szybszy niż jego unset()odpowiednik: aktualizacja wpisu tablicy symboli wydaje się szybsza niż jego usunięcie.
- przy próbie użycia nieistniejącej
unsetzmiennej ( ) zostanie wyzwolony błąd, a wartość wyrażenia zmiennej będzie zerowa. (Bo co jeszcze powinien zrobić PHP? Każde wyrażenie musi mieć jakąś wartość.)
- Zmienna z przypisanym null jest jednak nadal całkowicie normalną zmienną.
$whateverwskazuje na obiekt,$whatever = nullzastępuje wskaźnik, a nie sam obiekt, więc działa on w zasadzie tak samo jakunset().