Ответ
Функция unset() уничтожает указанную переменную в текущей области видимости.
Что происходит:
- Переменная удаляется из символической таблицы текущего scope.
- Если на значение, которое хранила переменная, больше нет ссылок, сборщик мусора освободит память.
- Последующие попытки доступа к переменной вызовут предупреждение
Undefined variable.
Пример:
$name = 'Alice';
unset($name);
var_dump($name); // PHP Notice: Undefined variable: name
Особенности для массивов и объектов:
- Для массива:
unset($arr[5])удалит элемент с индексом 5, но не переиндексирует массив. Для переиндексации используйтеarray_splice(). - Для объекта:
unset($obj->property)удалит публичное свойство. Если класс реализует магический метод__unset(), он будет вызван.
Ответ 18+ 🔞
А, ну это же про unset()! Ёпта, классика жанра, без неё никуда. Слушай, объясню на пальцах, чтобы даже мартышлюшка поняла.
Вот представь: у тебя есть переменная, ну, скажем, $name. Ты её создал, она там живёт, память занимает. И тут ты такой — «да похуй, не нужна она мне больше». Вот функция unset() — это как взять и выкинуть эту переменную нахуй из текущей области видимости. Всё, приехали. Её больше нет.
Что конкретно творится под капотом, бля:
- PHP просто берёт и стирает запись об этой переменной из своей внутренней таблицы для текущего scope. Как будто её и не было.
- Если на то значение, которое в переменной лежало, больше никто не ссылается, то сборщик мусора, хитрая жопа, приберётся и память освободит. А если где-то ещё ссылка есть — ну, значит, значение живёт дальше.
- Ну и если ты после этого попробуешь обратиться к переменной — будет тебе, чувак, предупреждение
Undefined variable. Сам напросился, ебать копать.
Вот, смотри, как это выглядит в деле:
$name = 'Alice';
unset($name);
var_dump($name); // PHP Notice: Undefined variable: name
Видишь? Сказали «Алиса, иди нахуй» — и её нет. Попробовал позвать — тишина в ответ и предупреждение в логах.
А теперь про тонкости, тут важно не облажаться:
- С массивами: Допустим,
unset($arr[5])удалит пятый элемент. Но, внимание, ёперный театр — массив не переиндексируется сам! На месте пятого индекса будет дыра. Если тебе надо всё сдвинуть, чтобы дыр не было, то это ужеarray_splice()в помощь.unset()просто вырывает страницу из книги, а нумерацию страниц не меняет. - С объектами:
unset($obj->property)— это попытка удалить публичное свойство у объекта. Но если класс не лыком шит и у него есть магический метод__unset(), то вызовется именно он. То есть объект может сам решать, как ему на это безобразие реагировать. Доверия ебать ноль, всегда смотри, с кем имеешь дело.
Вот и вся магия. Удалил — и нет проблем. Главное — не удали случайно то, что ещё нужно, а то будет тебе хиросима в коде.