Unset: примеры (PHP)
unset(mixed var [, mixed ...vars]): voidОсновные сведения о функции unset
Функция unset() в языке PHP предназначена для удаления переменных или элементов массива. Эта конструкция языка уничтожает указанные переменные, освобождая занимаемую ими память. Использование функции приводит к уменьшению счетчика ссылок на значение переменной. Когда счетчик достигает нуля, память освобождается сборщиком мусора.
Функция принимает один или несколько аргументов:
- $var - обязательный аргумент, переменная для удаления.
- $... - дополнительные необязательные аргументы, другие переменные для удаления.
Функция применяется в ситуациях, когда необходимо явно удалить переменную или элемент массива до окончания выполнения скрипта. Типичные случаи использования включают освобождение памяти от больших данных, удаление конфиденциальной информации, управление элементами массивов в циклах.
Простые примеры использования
$var = 'Значение';
echo $var;
unset($var);
var_dump(isset($var));Значение
bool(false)
$array = ['a' => 1, 'b' => 2, 'c' => 3];
unset($array['b']);
print_r($array);Array
(
[a] => 1
[c] => 3
)
$x = 10;
$y = 20;
$z = 30;
unset($x, $y, $z);
var_dump(isset($x), isset($y), isset($z));bool(false)
bool(false)
bool(false)
Похожие функции в PHP
В PHP существуют альтернативные способы управления переменными и массивами.
Присваивание значения null переменной сохраняет ее в области видимости, но очищает значение. Функция unset() полностью удаляет переменную.
$var = 'data';
$var = null;
var_dump($var); // NULL
var_dump(isset($var)); // falseФункция array_splice() удаляет элементы массива с возможностью замены. В отличие от unset(), она переиндексирует числовые ключи.
$arr = [10, 20, 30, 40];
array_splice($arr, 1, 1);
print_r($arr);Array
(
[0] => 10
[1] => 30
[2] => 40
)
Функция array_filter() позволяет удалять элементы на основе callback-функции, обеспечивая более сложную логику фильтрации.
Аналоги в других языках
Unset в Javascript
Оператор delete удаляет свойства объектов, но не работает с переменными.
let obj = {a: 1, b: 2};
delete obj.a;
console.log(obj);{ b: 2 }Unset в Python
Инструкция del удаляет ссылки на объекты.
arr = [1, 2, 3, 4]
del arr[1]
print(arr)[1, 3, 4]
Unset в MySQL
В SQL аналогом можно считать оператор DELETE для удаления строк из таблицы.
DELETE FROM users WHERE id = 1;Частые ошибки
При удалении несуществующего элемента массива ошибка не возникает, но это может маскировать логические ошибки.
$arr = ['a' => 1];
unset($arr['b']); // Ничего не происходит
print_r($arr);Array
(
[a] => 1
)
Удаление элемента массива во время итерации по ссылке может привести к неожиданному поведению.
$array = [1, 2, 3];
foreach ($array as &$value) {
if ($value == 2) unset($value);
}
print_r($array);Array
(
[0] => 1
[1] =>
[2] => 3
)
Без использования ключевого слова global функция удалит только локальную копию.
$globalVar = 'test';
function removeVar() {
unset($globalVar);
}
removeVar();
echo $globalVar;test
Изменения в новых версиях PHP
В PHP 8.0 произошли изменения в поведении функции unset() при работе с объектами. Ранее при попытке удалить свойство объекта, которое не существует, возникала ошибка уровня E_WARNING. Начиная с PHP 8.0, такое действие больше не генерирует предупреждение.
class Test {}
$obj = new Test();
unset($obj->undefinedProperty); // В PHP 7.x: Warning, в PHP 8+: Без предупрежденияТакже в PHP 7.4 появилась возможность использовать unset() для сброса типизированных свойств объектов до значения по умолчанию, если они не были объявлены как nullable.
Расширенные примеры
$data = [
'user' => [
'name' => 'Иван',
'contacts' => ['email' => 'test@mail.ru', 'phone' => '123456']
]
];
unset($data['user']['contacts']['phone']);
print_r($data);Array
(
[user] => Array
(
[name] => Иван
[contacts] => Array
(
[email] => test@mail.ru
)
)
)
class User {
public string $name;
public ?int $age;
}
$user = new User();
$user->name = 'Алексей';
$user->age = 25;
unset($user->age); // Сбрасывает значение на null, так как свойство nullable
var_dump($user->age);
// unset($user->name); // Фатальная ошибка в PHP 8+NULL
Для ассоциативных массивов порядок ключей сохраняется после удаления.
$order = ['first' => 1, 'second' => 2, 'third' => 3];
unset($order['second']);
$order['second'] = 2; // Добавляется в конец
print_r($order);Array
(
[first] => 1
[third] => 3
[second] => 2
)
$largeData = [];
for ($i = 0; $i < 10000; $i++) {
$largeData[] = str_repeat('data', 1000);
if ($i % 1000 === 0) {
unset($largeData[$i]); // Освобождение памяти
}
}$original = 'значение';
$reference = &$original;
unset($reference); // Удаляется только ссылка
echo $original;значение