isset
Функция isset() в PHP проверяет, задана ли переменная и не равна ли она null. Разбираем синтаксис, примеры и отличия от empty() и оператора ??.
Функция isset() в PHP
isset() — это языковая конструкция PHP, которая возвращает true, если переменная существует (была присвоена) и не равна null. Она возвращает false, если переменная никогда не была задана, явно была установлена в null или была удалена с помощью unset().
Поскольку обращение к неопределённой переменной вызывает предупреждение Warning: Undefined variable в PHP, isset() — это стандартный, безопасный способ проверить «есть ли у меня здесь используемое значение?» перед тем как его использовать. Например, для защиты доступа к $_GET, $_POST или ключам массива, которые могут отсутствовать.
В этой главе рассматриваются синтаксис, форма с несколькими аргументами, поведение с массивами и свойствами объектов, а также сравнение со связанными инструментами — empty() и оператором объединения с null.
Синтаксис
isset(mixed $var, mixed ...$vars): boolМинимальная проверка выглядит так:
if (isset($myVariable)) {
echo "The variable is set.";
} else {
echo "The variable is not set.";
}isset() — это языковая конструкция, а не вызов функции, поэтому вам не нужно ничего подключать или импортировать, и вы можете передать сразу несколько переменных (описано ниже).
Базовые примеры
<?php
// Example 1 — an assigned, non-null variable
$myVariable = "Hello, world!";
echo isset($myVariable) ? "set" : "not set"; // set
echo PHP_EOL;
// Example 2 — a variable that was never declared
echo isset($someOtherVariable) ? "set" : "not set"; // not set
echo PHP_EOL;
// Example 3 — a variable explicitly set to null
$empty = null;
echo isset($empty) ? "set" : "not set"; // not setВывод:
set
not set
not setТретий случай — главная ловушка: присвоение null заставляет isset() вернуть false, даже если переменная технически существует. Если вам нужно различить «никогда не была объявлена» и «объявлена, но равна null», используйте is_null() или array_key_exists().
Проверка нескольких переменных одновременно
Если передать более одного аргумента, isset() возвращает true только если каждый аргумент задан и не равен null. Это удобно для проверки того, что все обязательные поля формы пришли вместе.
<?php
$name = "Ada";
$email = "[email protected]";
$phone = null;
var_dump(isset($name, $email)); // bool(true)
var_dump(isset($name, $email, $phone)); // bool(false) — $phone is nullisset() с массивами
isset() работает с элементами массива и безопасно проверяет вложенные ключи без возникновения предупреждений при отсутствии промежуточного ключа.
<?php
$user = [
'name' => 'Ada',
'address' => ['city' => 'London'],
];
var_dump(isset($user['name'])); // bool(true)
var_dump(isset($user['missing'])); // bool(false)
var_dump(isset($user['address']['city'])); // bool(true)
var_dump(isset($user['address']['zip'])); // bool(false) — no warningОбратите внимание: isset($array['key']) возвращает false, если значение по этому ключу равно null. Если ключ может законно хранить null, и вам важно лишь наличие ключа, используйте array_key_exists().
isset() vs. empty() vs. оператор объединения с null
Эти три инструмента часто путают. В таблице показано, что каждый из них возвращает для одних и тех же входных данных:
Значение $x | isset($x) | empty($x) |
|---|---|---|
"hello" | true | false |
0 или "0" или "" | true | true |
null | false | true |
| не определено | false | true |
Используйте isset(), чтобы спросить «есть ли здесь реальное значение?», и empty() — чтобы спросить «это значение отсутствует или является ложным (пустая строка, 0, false, пустой массив)?».
Начиная с PHP 7, оператор объединения с null ?? опирается на семантику isset() и позволяет задать значение по умолчанию в одном выражении — это идиоматическая замена тернарному оператору isset() ? : :
<?php
$config = ['theme' => 'dark'];
// Verbose, pre-PHP 7 style:
$theme = isset($config['theme']) ? $config['theme'] : 'light';
// Equivalent with the null coalescing operator:
$theme = $config['theme'] ?? 'light';
echo $theme; // dark$config['missing'] ?? 'light' вычисляется в 'light' без предупреждений — именно потому, что ?? под капотом использует isset().
Когда использовать isset()
- Защита необязательных данных запроса:
if (isset($_GET['page'])) { ... }. - Проверка обязательных полей перед обработкой формы (
isset($a, $b, $c)). - Безопасное чтение потенциально отсутствующих ключей массива в конфигурации или данных, декодированных из JSON.
- Ленивая инициализация значения только один раз:
$cache ??= computeExpensiveValue();.
Используйте другой инструмент, если нужно считать null как «присутствующее» (array_key_exists()), проверить содержимое объекта или массива на ложность (empty()) или полностью удалить переменную (unset()).