Что делает функция unset с переменной в PHP?

Ответ

Функция unset() уничтожает указанную переменную в текущей области видимости.

Что происходит:

  1. Переменная удаляется из символической таблицы текущего scope.
  2. Если на значение, которое хранила переменная, больше нет ссылок, сборщик мусора освободит память.
  3. Последующие попытки доступа к переменной вызовут предупреждение 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() — это как взять и выкинуть эту переменную нахуй из текущей области видимости. Всё, приехали. Её больше нет.

Что конкретно творится под капотом, бля:

  1. PHP просто берёт и стирает запись об этой переменной из своей внутренней таблицы для текущего scope. Как будто её и не было.
  2. Если на то значение, которое в переменной лежало, больше никто не ссылается, то сборщик мусора, хитрая жопа, приберётся и память освободит. А если где-то ещё ссылка есть — ну, значит, значение живёт дальше.
  3. Ну и если ты после этого попробуешь обратиться к переменной — будет тебе, чувак, предупреждение Undefined variable. Сам напросился, ебать копать.

Вот, смотри, как это выглядит в деле:

$name = 'Alice';
unset($name);
var_dump($name); // PHP Notice: Undefined variable: name

Видишь? Сказали «Алиса, иди нахуй» — и её нет. Попробовал позвать — тишина в ответ и предупреждение в логах.

А теперь про тонкости, тут важно не облажаться:

  • С массивами: Допустим, unset($arr[5]) удалит пятый элемент. Но, внимание, ёперный театр — массив не переиндексируется сам! На месте пятого индекса будет дыра. Если тебе надо всё сдвинуть, чтобы дыр не было, то это уже array_splice() в помощь. unset() просто вырывает страницу из книги, а нумерацию страниц не меняет.
  • С объектами: unset($obj->property) — это попытка удалить публичное свойство у объекта. Но если класс не лыком шит и у него есть магический метод __unset(), то вызовется именно он. То есть объект может сам решать, как ему на это безобразие реагировать. Доверия ебать ноль, всегда смотри, с кем имеешь дело.

Вот и вся магия. Удалил — и нет проблем. Главное — не удали случайно то, что ещё нужно, а то будет тебе хиросима в коде.