unset()
Функция unset() уничтожает переменную или элемент массива в PHP, освобождает память и удаляет переменные.
Введение
Функция unset() — это встроенная функция PHP, которая уничтожает переменную или элемент массива. После того как переменная удалена с помощью unset(), она больше не существует — обращение к ней снова ведёт себя так, как если бы она никогда не была объявлена.
На этой странице рассматриваются синтаксис unset(), её поведение с массивами, ссылками, свойствами объектов и переменными внутри функций, а также отличие от простого присвоения null. Понимание этих различий помогает писать предсказуемый код и избегать наиболее распространённых ошибок при работе с unset().
Ключевой момент: unset() удаляет имя (привязку переменной), но не обязательно само значение. PHP освобождает память, занятую значением, автоматически через подсчёт ссылок и сборщик мусора, когда на значение больше ничего не указывает — не в момент вызова unset().
Синтаксис
unset(mixed $var, mixed ...$vars): voidФункция принимает одну или несколько переменных (разделённых запятыми) и ничего не возвращает (void). Каждый аргумент — это переменная или элемент массива, который нужно уничтожить.
<?php
$a = 1;
$b = 2;
$c = 3;
unset($a, $b, $c); // destroy several variables in one call
?>Удаление элемента массива
Наиболее распространённое применение unset() — удаление элемента из массива по его ключу:
Пример использования PHP unset()
Здесь мы удаляем элемент с индексом 1 ("banana"). Вывод:
Array
(
[0] => apple
[2] => cherry
)Обратите внимание: unset() не переиндексирует массив — оставшиеся ключи остаются 0 и 2, образуя «пробел». Это наиболее частый сюрприз при работе с unset(). Если нужен чистый, последовательно переиндексированный список (0, 1, 2, …), передайте результат в array_values():
<?php
$array = ["apple", "banana", "cherry"];
unset($array[1]);
$array = array_values($array);
print_r($array);
?>Array
(
[0] => apple
[1] => cherry
)Уничтожение обычной переменной
При вызове с простой переменной unset() полностью удаляет её. После этого переменная считается неопределённой:
<?php
$name = "John";
unset($name);
echo $name ?? "Variable is unset"; // Outputs: Variable is unset
?>Оператор объединения с null ?? — безопасный способ считать возможно удалённую переменную, поскольку он не вызывает предупреждение «Undefined variable». Использование isset() — ещё один распространённый способ проверить, существует ли переменная.
unset() против присвоения null
Эти два подхода выглядят похоже, но не идентичны:
<?php
$x = 5;
$y = 5;
unset($x); // $x no longer exists
$y = null; // $y still exists, its value is null
var_dump(isset($x)); // bool(false) — the variable is gone
var_dump(isset($y)); // bool(false) — isset() returns false for null too
var_dump(array_key_exists('y', get_defined_vars())); // bool(true) — $y is still defined
?>Используйте unset(), когда хотите, чтобы переменная (или ключ массива) не существовала. Присваивайте null, когда хотите сохранить переменную, но очистить её значение. Обратите внимание, что isset() возвращает false в обоих случаях, поэтому для их различия нужно проверять наличие ключа напрямую. Смотрите is_null() и empty() для связанных проверок.
unset() внутри функции
Поведение unset() зависит от области видимости переменной, что часто удивляет разработчиков:
<?php
function destroy_local() {
$value = 10;
unset($value); // only the local copy is destroyed
echo $value ?? "local is unset"; // Outputs: local is unset
}
destroy_local();
?>Когда вы применяете unset() к переменной, переданной по ссылке, разрывается только локальная ссылка — переменная вызывающего кода остаётся нетронутой:
<?php
function destroy_ref(&$ref) {
unset($ref); // breaks the local binding, not the original
}
$data = "keep me";
destroy_ref($data);
echo $data; // Outputs: keep me
?>Если вам действительно нужно, чтобы функция удаляла переменную из вызывающей области видимости, передайте её как элемент массива по ссылке или используйте глобальную переменную — но в большинстве случаев чище переработать код так, чтобы возвращать значение. Подробнее о правилах области видимости см. в разделе Variables Scope.
Удаление свойств объекта
unset() также удаляет свойство из экземпляра объекта:
<?php
$user = new stdClass();
$user->name = "Ann";
$user->role = "admin";
unset($user->role);
var_dump(isset($user->role)); // bool(false)
print_r($user);
?>bool(false)
stdClass Object
(
[name] => Ann
)Ловушка с ссылкой в foreach
Классическая ошибка: после итерации массива со ссылкой (&$value) переменная-ссылка по-прежнему указывает на последний элемент. Повторное использование её позже незаметно портит массив. Исправление — вызвать unset() для ссылки сразу после цикла:
<?php
$items = [1, 2, 3];
foreach ($items as &$value) {
$value *= 2;
}
unset($value); // break the dangling reference — do this every time
print_r($items);
?>Array
(
[0] => 2
[1] => 4
[2] => 6
)Заключение
unset() уничтожает переменные, элементы массивов и свойства объектов, удаляя привязку, чтобы имя больше не существовало. Запомните следующее:
- Функция удаляет имя, но не обязательно значение — память освобождается подсчётом ссылок и сборщиком мусора PHP.
- Удаление элемента массива оставляет пробел; используйте
array_values()для переиндексации. - Это не то же самое, что присвоение
null;unset()заставляет переменную перестать существовать. - Внутри функций учитывается область видимости, а удаление параметра, переданного по ссылке, разрывает только локальную привязку.
- Всегда вызывайте
unset()для переменной цикла послеforeach ... as &$value.
Чтобы узнать больше о работе с данными, которыми оперирует unset(), изучите разделы PHP Variables и PHP Arrays.