Что лучше в освобождении памяти с PHP: сброс () или $var = пустой указатель

С C ++ 17 вы можете использовать структурированное связывание для выполнения этого:

236
задан alex 7 May 2010 в 01:07
поделиться

3 ответа

Это было упомянуто в страница руководства сброса в 2009 :

unset() делает, что его имя говорит - сбрасывает переменную. Это не вызывает непосредственное освобождение памяти. Сборщик "мусора" PHP сделает это, когда это будет видеть соответствия - намерением так скоро, как те циклы ЦП не необходимы так или иначе, или уже прежде чем сценарий исчерпал бы память, независимо от того, что происходит сначала.

, Если Вы делаете $whatever = null; тогда, Вы переписываете данные переменной. Вы могли бы получить память, освобожденную / уменьшенный быстрее, но она может украсть циклы ЦП из кода, которому действительно нужны они раньше, закончившись в более длительное полное время выполнения.

(С 2013, это unset страница справочника больше не включают тот раздел)

Примечание, что до php5.3, если Вы имеете , два объекта в циклической ссылке , такой как в отношениях отцов и детей, называя сброс () на родительском объекте не освободят память, используемую для родительской ссылки в дочернем объекте. (И при этом память не будет освобождена, когда родительский объект будет собран "мусор".) ( ошибка 33595 )

<час>

вопрос" различие между сбросом и = пустой указатель " детали некоторые различия:

<час>

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? Каждое выражение должно привести к некоторому значению.)
  • переменная А с пустым указателем, присвоенным ему, является все еще совершенно нормальной переменной все же.
228
ответ дан Community 23 November 2019 в 03:26
поделиться

unset не на самом деле функция, но конструкция языка . Это больше не вызов функции, чем return или include.

Кроме проблем производительности, с помощью unset делает код намерение намного более ясный.

46
ответ дан Alex Barrett 23 November 2019 в 03:26
поделиться

Путем выполнения сброса () на переменной, Вы по существу отметили переменную для 'сборки "мусора"' (PHP действительно не имеет один, но для пользы примера), таким образом, память не сразу доступна. Переменная больше не содержит данные, но стек остается в большем размере. Выполнение пустого метода отбрасывает данные и уменьшает стековую память почти сразу.

Это было от личного опыта и других также. См. комментарии сброса () функция здесь .

я лично использую сброс () между повторениями в цикле так, чтобы у меня не было задержки стека, находящегося эй-yo'd в размере. Данных не стало, но место остается. На следующем повторении память уже берется php и таким образом, более быстрая для инициализации следующей переменной.

35
ответ дан William Holroyd 23 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: