Доброго всем времени суток! Копаясь в легаси заметил что там частенько используется функция unset для удаления массивов или объектов, при отсутствие или наличие данной функции на результате не как не сказывается, а значит применяется unset, для очистки памяти. Но зачем?!?? Почему не оставить эту работу сборщику мусора?!??
Сборщик мусора должен знать что убирать. unset как раз и указывает на то какие данные больше не нужны и их можно удалять из памяти. Если вам нужно очистить память до того как за это возмётся сборщик мусора, то используйте присваивание $data = null;
Ему не нужно указывать, ему можно подсказать.
Делается это в редких случаях, когда это реально необходимо. Ну или когда автор кода не понимает, что пишет. Если в кодовой базе она используется часто, как вы утверждаете, то, скорее всего, применимо второе.
Дружочек, представьте, что у вас есть переменная,
$text = "дофигиллиард символов";
А теперь скажите мне пожалуйста, как "сборщик мусора" должен догадаться, будет она вам нужна в дальнейшем, или нет?
Я правильно понимаю, что вы ожидаете от сборщика мусора, что когда вы ниже по коду обратитесь к этой переменной, её уже не будет?
Или что, по-вашему, сборщик должен "сам убирать без подсказки"?
FanatPHP, Не пойму, тостер что то сделал что теперь тегнутые пользователи в сообщении не отображаются? Или просто никто не пользуется кнопкой "Ответить"? Не понимаю кто кому что отвечает. :(
Давайте вы меня выслушаете ещё раз, только внимательно.
Вот у вас в коде переменная,
$text = "дофигиллиард символов";
Далее по коду есть условие.
Если оно выполняется, то переменная $text используется в коде
Если не выполняется - то эта переменная уже нигде не понадобится.
Каким, по вашему, образом, должны вдруг "исчезнуть все ссылки на её значение" и в какой конкретно момент времени?
FanatPHP, мне не очевидно. Это был коммент на ответ? На коммент автора вопроса? На мой?
Я не тегаю тогда, когда уведомление и так придёт адресату и когда по тексту очевидно, к кому он обращён.
FanatPHP, ну смотрите перед тем как создать на основе исходного кода, байткод интерпретатор создаёт семантическое дерево и на этом этапе интерпретации можно определить в какой конкретно момент выполнения кода, условная переменная будет уже не нужна и сборщик мусора сможет её удалить.
JastaFly, вы уж определитесь, или "когда в коде исчезнут все ссылки на значение это переменной" или когда ссылки есть, но интерпретатор что-то там внутри себя порешает, по какой ветке пойдет исполнение кода
в целом, претензия нелепая, и скорее всего вызвана, как уже говорилось, не особенностями языка, а криворукостью автора конкретного кода. По факту вызывать ансет для очистки памяти в пхп приходится редко.
FanatPHP, у меня нет никаких претензий, просто заметив такую особенность мне стало интересно, зачем и пришел сюда просветиться, так сказать в целях общего развития.
Просто исходя из Ваших комментариев предыдущих комментариев складывается впечатление что те кто расставляют без меры unset по коду вообщем-то правы ибо от сборщика мусора толку не особо.
JastaFly, в целях общего развития рекомендую подтянуть азы булевой логики
потому что либо "когда в коде исчезнут все ссылки на значение это переменной"
либо "те кто расставляют без меры unset по коду вообщем-то правы"
те кто расставляют без меры unset по коду вообщем-то правы ибо от сборщика мусора толку не особо.
Это справедливо только для портяночного кода, где функция (или вообще скрипт) занимает тысячу строк и делает всё на свете. Тогда да, там в начале могут остаться переменные, которые к концу уже неактуальны.
Если же у вас код нормально структурирован, то освобождать память руками нет необходимости - после выхода из текущей функции она будет очищена и так.