empty($var) возвращает true, если переменной нет или её значение ложно: null, false, 0, 0.0, "", "0" или пустой массив []. Для любого другого значения она возвращает false. Как и isset(), она никогда не предупреждает о неопределённых переменных или ключах массива.
empty($x) это то же самое, что !isset($x) || !$x. Иначе говоря: отсутствует или приводится к false.
Какие значения пустые
Выберите значение в таблице, чтобы увидеть empty() рядом с isset() и приведением (bool). Каждую ячейку вычислил PHP 8.3.
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
Сюрпризы с обеих сторон: "0" пусто, а " " (пробел), "0.0", "null" и [0] нет.
"0" пусто: классическая ошибка
Поскольку "0" ложно, empty() воспринимает количество 0, счёт 0 или PIN "0" как "ничего не введено". Это бьёт по формам, где каждое значение приходит строкой.
Для текстового ввода надёжная проверка "ничего не введено" это trim($value) === "". Оставьте empty() для значений, где 0 действительно означает "ничего".
Проверка пустой строки
Чтобы точно проверить пустую строку, сравнивайте с "". Чтобы считать пустыми и одни пробелы, сначала примените trim. Начиная с PHP 5.5 empty() принимает выражения, так что empty(trim($s)) тоже работает (но с той же проблемой "0").
В PHP 8.1 и новее trim() не принимает null без уведомления об устаревании, поэтому в блоке написано trim($s ?? "").
Проверка пустого массива
Для массивов empty($arr), $arr === [] и count($arr) === 0 дают одинаковый ответ. Преимущество empty() в том, что она работает с переменной или ключом, которых может не быть.
array_filter() без колбэка удаляет все ложные значения, так что это быстрый способ спросить "есть ли в массиве что-то настоящее".
Проверка обязательного поля формы
!empty() часто используют, чтобы сделать поле обязательным, если только 0 не допустимый ответ. Запустите этот блок, оставьте поля пустыми и нажмите Send, затем заполните их и отправьте снова: скрипт выполнится ещё раз с заполненным $_POST.
empty($_POST["terms"]) покрывает для чекбокса оба случая: он не отправлен вовсе или отправлен с пустым значением. На странице о формах разобраны сообщения об ошибках для каждого поля.
empty и isset
Обе безопасны для неопределённых переменных и ключей. Они отвечают на разные вопросы:
isset($x): существует ли и неnullли? Для необязательных ключей, чекбоксов и вопроса "было ли это отправлено вообще".!empty($x): существует ли и истинно ли? Для вопроса "есть ли что-то настоящее", когда0и"0"не в счёт.$x === ""или$x === []: точно ли пусто? Когда0допустимое значение.
Другая половина описана на странице про isset, включая isset() с несколькими переменными сразу и отличие от array_key_exists().
Часто задаваемые вопросы
Какие значения empty() считает пустыми в PHP?
empty($x) даёт true, когда $x не существует или равна null, false, 0, 0.0, "", "0" или []. Всё остальное не пусто, включая " " (пробел), "0.0", "false" и [0].
Почему "0" в PHP считается пустым?
empty() это то же самое, что !$x, только без предупреждения о неопределённых переменных, а строка "0" приводится к false. Поэтому empty() не подходит для полей, где 0 допустимый ответ; проверяйте $x === '' или trim($x) === ''.
Как проверить, пуст ли массив в PHP?
Работают и empty($arr), и $arr === [], и count($arr) === 0. empty() ещё и возвращает true, когда переменная не задана, а count() для неопределённой переменной выдал бы предупреждение и затем выбросил бы TypeError для null.
Когда использовать empty() вместо isset()?
Используйте isset(), когда нужно лишь знать, что значение существует (чекбокс отправлен, ключ настройки есть). Используйте !empty(), когда значение ещё и должно быть непустым, например обязательное текстовое поле. Осторожнее с полями, где 0 допустим: empty('0') даёт true.