📚
#14 16.09.2025 PHP Basics
unset(mixed $var, mixed ...$vars): void

Расскажите об использовании языковой конструкции unset().

unset() — уничтожает переменные, удаляя их из текущей области видимости. Работает с переменными, элементами массивов и public-свойствами объектов. Не переиндексирует массивы. Не удаляет глобальные переменные из функций без $GLOBALS. Отличается от присваивания null (уничтожение vs. обнуление). Не может удалить константы.

Подробнее
⚠️
Внимание! Этот текст был сгенерирован AI-ассистентом. Информация может содержать неточности и требует проверки.

Полный ответ:

1. Основное назначение и синтаксис

unset() — это языковая конструкция, которая уничтожает указанные переменные.

unset(mixed $var, mixed ...$vars): void

Пример использования:

unset($variable);
unset($var1, $var2, $var3); // Можно уничтожить несколько переменных сразу

2. Что именно делает unset()?

  • Удаляет переменную из области видимости. После вызова unset() переменная перестает существовать в своей области видимости (скопе).
  • Уменьшает счетчик ссылок на значение (refcount) в механизме Copy-On-Write (COW) Zend Engine. Если на значение, которое хранила переменная, больше нет ссылок, память освобождается.

Проверка:

$var = 'value';
var_dump(isset($var)); // bool(true)

unset($var);
var_dump(isset($var)); // bool(false)
var_dump($var); // Notice: Undefined variable

3. Особенности использования

3.1. Уничтожение элемента массива

unset() часто используется для удаления конкретного элемента ассоциативного или индексного массива.

$array = ['a', 'b', 'c'];
unset($array[1]); // Удаляем элемент с индексом 1 ('b')
print_r($array); // Array( [0] => a [2] => c )

Важно: unset() не переиндексирует числовые ключи массива. Для переиндексации нужно использовать array_values().

3.2. Уничтожение переменных по ссылке

При уничтожении переменной, которая является ссылкой, уничтожается только сама ссылка, а не исходное значение.

$a = 10;
$b = &$a;
unset($b); // Удаляется только ссылка $b
echo $a;   // 10 - значение остается

3.3. Поведение внутри функций

unset() работает только в своей области видимости. Уничтожение глобальной переменной внутри функции не удалит её глобально.

$globalVar = 'test';

function destroyVar() {
    global $globalVar;
    unset($globalVar); // Уничтожает только локальную ссылку на глобальную переменную
}

destroyVar();
echo $globalVar; // 'test' - глобальная переменная осталась

Чтобы удалить глобальную переменную, нужно напрямую обращаться к массиву $GLOBALS:

unset($GLOBALS['globalVar']);

3.4. unset() и свойства объектов

С помощью unset() можно удалять доступные (public) свойства объекта.

class Test {
    public $publicProp = 'public';
    private $privateProp = 'private';
}

$obj = new Test();
unset($obj->publicProp);   // OK
unset($obj->privateProp);  // Fatal error: Cannot access private property

4. Отличие от присваивания null

unset() и присваивание null — это разные операции:

  • unset($var)уничтожает переменную. Переменная больше не существует.
  • $var = nullприсваивает переменной пустое значение. Переменная продолжает существовать, но её тип теперь NULL.

Проверка:

$var1 = null;
$var2 = 'value';

var_dump($var1); // NULL - переменная есть, значение NULL
var_dump(isset($var1)); // false - но isset() её не видит

unset($var2);
var_dump(isset($var2)); // false - переменной не существует
// var_dump($var2); // Notice: Undefined variable

5. Что нельзя сделать с помощью unset()?

  • Нельзя удалить константу, определенную через define() или const. Для этого просто не существует функции.
  • Нельзя удалить статические переменные внутри функции после первого вызова.
    function test() {
        static $staticVar = 0;
        $staticVar++;
        unset($staticVar); // Не сработает, предупреждение
    }
    
  • Нельзя удалить функцию или класс.

6. Практическое применение

  • Освобождение памяти от больших временных переменных.
  • Удаление значений из массивов (например, $_SESSION, $_GET).
  • Очистка данных перед повторным использованием переменных.
  • Реализация шаблонов проектирования (например, удаление ссылок в паттерне Singleton для тестирования).

Итог:

unset() — уничтожает переменные, удаляя их из текущей области видимости. Работает с переменными, элементами массивов и public-свойствами объектов. Не переиндексирует массивы. Не удаляет глобальные переменные из функций без $GLOBALS. Отличается от присваивания null (уничтожение vs. обнуление). Не может удалить константы.