isset(mixed $var, mixed ...$vars): bool
Расскажите об этой языковой конструкции всё, что знаете.
isset()
— это безопасный способ проверить существование переменной, ключа массива или свойства объекта без генерации предупреждений.
Она возвращает false
только в двух случаях: если переменная не существует или если её значение равно null
. Не путайте с empty()
(проверяет на “falsey”) и is_null()
(проверяет строго на null
).
Полный ответ:
1. Основное назначение и синтаксис
isset()
— это встроенная языковая конструкция, которая проверяет, инициализирована ли переменная и не равна ли она null
.
isset(mixed $var, mixed ...$vars): bool
Она может принимать несколько аргументов и возвращает true
, только если все переданные переменные существуют и не равны null
.
$var = 'test';
var_dump(isset($var)); // bool(true)
var_dump(isset($undefinedVar)); // bool(false) - переменной не существует
$nullVar = null;
var_dump(isset($nullVar)); // bool(false) - переменная существует, но равна null
2. Ключевые особенности
- Подавление предупреждений:
isset()
не генерирует предупреждение (E_NOTICE
илиE_WARNING
) если переменная не определена. Это её основное преимущество перед прямой проверкой.- Плохо:
if ($undefinedVar) {...} // Notice: Undefined variable
- Хорошо:
if (isset($undefinedVar)) {...} // Никаких предупреждений
- Плохо:
- Поведение с несколькими аргументами: Возвращает
true
только если все переменные установлены.$a = 1; $b = null; $c = 3; var_dump(isset($a, $c)); // true (обе установлены) var_dump(isset($a, $b, $c)); // false ($b - null)
- Поведение с элементами массивов: Чаще всего используется для проверки существования ключа в массиве (особенно в
$_GET
,$_POST
,$_SESSION
).// Проверка одноуровнего ключа if (isset($_GET['search'])) { $searchTerm = $_GET['search']; } // Проверка вложенных ключей (лучший способ) if (isset($_SESSION['user']['profile']['email'])) { $email = $_SESSION['user']['profile']['email']; }
- Поведение со свойствами объектов: Проверяет, существует ли свойство у объекта и не равно ли оно
null
.class User { public $name; private $age = 18; public function __construct() { var_dump(isset($this->age)); // true } } $user = new User(); $user->name = 'John'; var_dump(isset($user->name)); // true var_dump(isset($user->age)); // false (нет доступа в этой области видимости) var_dump(isset($user->undefinedProp)); // false (не существует)
Важно:
isset()
может проверять только доступные свойства (public или private/protected из соответствующей области видимости).
3. Что возвращает isset()
для разных значений?
isset()
возвращает true
для переменных, которые существуют и чье значение не является null
. Это включает в себя:
- Ложные значения:
false
,0
,''
(пустая строка),[]
(пустой массив) - Ресурсы, объекты, любые не-
null
значения
$false = false;
$zero = 0;
$emptyStr = '';
var_dump(isset($false)); // true
var_dump(isset($zero)); // true
var_dump(isset($emptyStr)); // true
4. Отличие от других функций и конструкций
Конструкция | Проверяет | Возвращает для $var = null; |
Для необъявленной $var |
---|---|---|---|
isset($var) |
Существует и не null |
false |
false (без предупреждения) |
empty($var) |
“Falsey”-значение | true |
true (без предупреждения) |
is_null($var) |
Является ли null |
true |
true (с предупреждением) |
$var === null |
Является ли null |
true |
true (с предупреждением) |
empty()
эквивалентна !isset($var) || $var == false
.
5. Распространенные ошибки и лучшие практики
- Проверка вложенных структур: Для глубокой проверки вложенных массивов используйте
isset()
на каждом уровне.// Правильно и безопасно if (isset($data['user']) && isset($data['user']['address'])) { // ... } // С PHP 7 можно использовать так (но это менее читаемо) if (isset($data['user']['address'])) { // ... }
-
Не использовать для проверки на
null
: Если вам нужно точно знать, равна ли переменнаяnull
, используйтеis_null()
или строгое сравнение$var === null
. - Использование с
unset()
:isset()
возвращаетfalse
после того, как переменная была уничтожена с помощьюunset()
.$var = 'test'; unset($var); var_dump(isset($var)); // false
Итог:
isset()
— это безопасный способ проверить существование переменной, ключа массива или свойства объекта без генерации предупреждений. Она возвращает false
только в двух случаях: если переменная не существует или если её значение равно null
. Не путайте с empty()
(проверяет на “falsey”) и is_null()
(проверяет строго на null
).