Это было упомянуто на нерабочей странице руководства в 2009 году :
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
переменную non-existing ( ), возникает ошибка, и значение для выражения переменной будет нулевым. (Потому что, что еще должен делать PHP? Каждое выражение должно приводить к некоторому значению.)
- Переменная с присвоенным ей нулем все еще остается совершенно нормальной переменной.
$whatever
указывает на объект,$whatever = null
перезаписывает указатель, а не сам объект, поэтому он действует в основном так же, какunset()
.