unset(mixed $var, mixed ...$vars): void
Расскажите об использовании языковой конструкции unset()
.
unset()
— уничтожает переменные, удаляя их из текущей области видимости. Работает с переменными, элементами массивов и public-свойствами объектов. Не переиндексирует массивы. Не удаляет глобальные переменные из функций без $GLOBALS
. Отличается от присваивания null
(уничтожение vs. обнуление). Не может удалить константы.
Полный ответ:
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. обнуление). Не может удалить константы.