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. unset
Ta 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ż $a
z 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 = null
jest używany:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Wygląda na $a = null
to, ż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
unset
zmiennej ( ) 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ą.
$whatever
wskazuje na obiekt,$whatever = null
zastępuje wskaźnik, a nie sam obiekt, więc działa on w zasadzie tak samo jakunset()
.