Про це згадувалося на сторінці незавершеного посібника у 2009 році :
unset()робить лише те, що говорить його назва - unset змінної. Це не примушує негайно звільнити пам'ять. Збірник сміття PHP зробить це, коли помітить, що завгодно, оскільки ці цикли процесора все-таки не потрібні, або пізніше, ніж у сценарію не вистачить пам'яті, що б не відбулося спочатку.
Якщо ви це робите, $whatever = null;ви переписуєте дані змінної. Ви можете звільнити / скоротити пам'ять швидше, але це може викрасти цикли процесора з коду, який їм справді потрібен швидше, що призводить до більшого загального часу виконання.
(З 2013 року ця unsetсторінка більше не включає цей розділ)
Зауважте, що до php5.3, якщо у вас є два об'єкти в круговій посиланні , наприклад, у відносинах батько-дитина, виклик unset () на батьківському об'єкті не звільнить пам'ять, яка використовується для батьківського посилання в дочірньому об'єкті. (Також не буде звільнена пам'ять, коли батьківський об'єкт збирається сміттям.) ( Помилка 33595 )
Питання " різниця між unset та = null " описує деякі відмінності:
unset($a)також видаляє $aз таблиці символів; наприклад:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Виходи:
Notice: Undefined variable: a in xxx
NULL
Але коли $a = nullвикористовується:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Здається, $a = nullце трохи швидше, ніж його unset()аналог: оновлення запису таблиці символів здається швидшим, ніж видалення.
- при спробі використовувати неіснуючу (
unset) змінну, буде спровокована помилка і значення для виразу змінної буде нульовим. (Тому що, що ще потрібно робити PHP? Кожен вираз повинен мати певне значення.)
- Змінна з присвоєним їй null все ж є абсолютно нормальною змінною.
$whateverвказує на об'єкт,$whatever = nullперезаписує вказівник, а не сам об’єкт, тому він діє в основному так само, якunset().