isset($var) возвращает true, если переменная существует и её значение не null. Для неопределённой переменной, удалённой через unset или хранящей null, она возвращает false и никогда не печатает предупреждений.
isset() смотрит только на то, есть ли что-то на месте. Значение, которое задано, но пусто, например 0, "" или [], всё равно даёт true. Если нужно "задано и не пусто", используйте empty с отрицанием.
Проверка ключа массива через isset
Чаще всего isset() используют именно так. Чтение несуществующего ключа в обычной конфигурации PHP печатает Warning: Undefined array key; предварительная проверка через isset() этого не делает. Она работает и для вложенных ключей и тихо останавливается на первом отсутствующем уровне.
Когда нужно только значение или значение по умолчанию, $user["website"] ?? "none" делает ту же проверку за один шаг. Смотрите оператор объединения с null.
isset с несколькими переменными
Передайте несколько аргументов, и isset() вернёт true, только если все они заданы и не равны null. Это короткий способ убедиться, что пришли все обязательные поля.
isset для строк и объектов
Для строки isset($str[5]) проверяет, есть ли символ на позиции 5, это быстрая проверка длины. Для объекта проверяется свойство; если у класса с закрытыми данными определён метод __isset(), isset() вызывает его.
isset, empty и is_null
Выберите значение $x в таблице, чтобы сравнить три проверки и простое приведение (bool). Каждую ячейку вычислил PHP 8.3.
| $x | isset | empty | is_null | bool |
|---|---|---|---|---|
| null | ||||
| false | ||||
| 0 | ||||
| "0" | ||||
| "" | ||||
| " " | ||||
| [] | ||||
| "a" | ||||
| 1 | ||||
| 0.0 | ||||
| "0.0" |
Что стоит запомнить:
isset()даётfalseтолько дляnullи того, чего не существует.empty()даётtrueдля этого же и ещё для любого ложного значения:false,0,0.0,"","0",[].is_null()для существующих переменных даёт противоположноеisset(), но предупреждает, когда переменная не определена. Вместо неё используйтеisset()или=== null.
Проверка отправки формы
isset() это классический способ узнать, пришло ли поле формы. Запустите этот блок, введите имя и нажмите Send: тот же скрипт выполнится снова с заполненным $_POST.
Пустое текстовое поле всё равно отправляется, как "", поэтому после любой отправки isset($_POST["name"]) даёт true. Неотмеченный чекбокс не отправляется вовсе, поэтому для чекбоксов isset() ровно то, что нужно. Чтобы требовать непустое значение, проверяйте строку после trim, как в этом блоке. На странице о формах собрана полная форма с проверкой.
isset и array_key_exists
Они совпадают во всём, кроме ключа со значением null. isset() считает его отсутствующим, array_key_exists() нет.
Если в ваших данных "задано как null" значит не то же самое, что "не настроено", используйте array_key_exists(). В остальных случаях isset() короче, а поскольку это языковая конструкция, а не вызов функции, ещё и немного быстрее.
Частая ошибка: isset для выражения
isset() принимает только переменные, элементы массивов и свойства. Передача результата функции или константы вызывает ошибку компиляции:
<?php
if (isset(trim($input))) {}
PHP Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /home/index.php on line 2
Сначала сохраните результат в переменную или проверяйте само значение: null !== $expr, как предлагает сообщение, или trim($input) !== "" для строки.
Часто задаваемые вопросы
Что делает isset() в PHP?
isset($x) возвращает true, если $x существует и не равна null, и false в остальных случаях. Она никогда не выдаёт предупреждения о неопределённой переменной или ключе массива, поэтому безопасна для данных запроса вроде isset($_POST['email']).
Чем isset() отличается от empty() в PHP?
isset() спрашивает "существует ли это и не null ли оно"; empty() спрашивает "отсутствует ли это или ложно". Для 0, "", "0" и [] isset() возвращает true, и empty() тоже возвращает true. Для null или отсутствующего ключа isset() даёт false, а empty() даёт true. !empty($x) равносильно тому, что isset($x) верно и $x истинно.
Может ли isset() проверить несколько переменных?
Да: isset($a, $b, $c) возвращает true, только если каждая из них задана и не равна null. Проверка останавливается на первой незаданной.
Что использовать, isset() или array_key_exists()?
Они различаются только тогда, когда ключ существует со значением null: isset($arr['k']) возвращает false, а array_key_exists('k', $arr) возвращает true. Используйте array_key_exists, когда null это осмысленное сохранённое значение; в остальных случаях isset короче и немного быстрее.