W3docs

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()

php— editable, runs on the server

Здесь мы удаляем элемент с индексом 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.

Практика

Практика
Какова основная функция unset() в PHP?
Какова основная функция unset() в PHP?
Was this page helpful?