isset и empty в PHP: разница, примеры и частые ошибки новичков
Один из частых поисковых запросов новичков — isset и empty в PHP разница. Обе конструкции помогают проверять значения, но делают это по-разному. Из-за неправильного выбора легко получить баг: поле формы вроде заполнено, но PHP считает его пустым; элемент массива существует, но проверка ведёт себя неожиданно.
Что делает isset() в PHP
isset() проверяет, существует ли переменная и не равна ли она null. Если переменная объявлена и содержит любое значение, кроме null, результат будет true.
$name = 'Анна';
$age = 0;
$active = false;
$deletedAt = null;
var_dump(isset($name)); // true
var_dump(isset($age)); // true
var_dump(isset($active)); // true
var_dump(isset($deletedAt)); // false
var_dump(isset($unknown)); // false
Важный вывод: 0, false и пустая строка для isset() — это существующие значения. Исключение — только null и несуществующая переменная.
Что делает empty() в PHP
empty() проверяет, является ли значение «пустым» с точки зрения PHP. При этом она не выдаёт предупреждение, если переменная не существует.
$values = [
'' => '',
'zero' => 0,
'str0' => '0',
'false' => false,
'null' => null,
'array' => [],
'text' => 'hello',
];
var_dump(empty($values['zero'])); // true
var_dump(empty($values['str0'])); // true
var_dump(empty($values['false'])); // true
var_dump(empty($values['array'])); // true
var_dump(empty($values['text'])); // false
var_dump(empty($notExists)); // true
Самая неожиданная особенность: строка '0' считается пустой. Это важно при обработке форм, фильтров, количества товаров, рейтингов и любых полей, где ноль является допустимым значением.
Короткая таблица различий
| Значение | isset() | empty() |
|---|---|---|
$x = 'text' | true | false |
$x = '' | true | true |
$x = 0 | true | true |
$x = '0' | true | true |
$x = false | true | true |
$x = null | false | true |
| переменной нет | false | true |
Проверка элементов массива
Чаще всего isset() и empty() используют при работе с массивами: настройками, данными пользователя, параметрами URL и результатами из базы.
$user = [
'name' => 'Иван',
'email' => '',
'age' => 0,
];
if (isset($user['name'])) {
echo 'Ключ name существует и не null';
}
if (empty($user['email'])) {
echo 'Email не заполнен';
}
if (isset($user['age'])) {
echo 'Возраст передан, даже если он равен 0';
}
Если вам нужно узнать именно наличие ключа в массиве, даже если значение равно null, используйте array_key_exists().
$data = ['token' => null];
var_dump(isset($data['token'])); // false
var_dump(array_key_exists('token', $data)); // true
Практический пример: обработка формы
Допустим, есть форма с полями email и quantity. Количество может быть равно нулю, например, если пользователь хочет очистить корзину. В таком случае empty() для проверки количества будет плохим выбором.
$email = $_POST['email'] ?? '';
$quantity = $_POST['quantity'] ?? null;
$errors = [];
if (trim($email) === '') {
$errors[] = 'Введите email';
}
if ($quantity === null || !is_numeric($quantity)) {
$errors[] = 'Количество должно быть числом';
} else {
$quantity = (int) $quantity;
}
if ($errors) {
print_r($errors);
} else {
echo 'Данные можно обрабатывать';
}
Здесь мы не используем empty($quantity), потому что значение '0' тоже стало бы «пустым». Вместо этого отдельно проверяем наличие и числовой формат.
Когда использовать isset()
- Когда нужно проверить, передан ли параметр.
- Когда важно отличить
nullот реального значения. - Когда проверяете несколько переменных сразу.
if (isset($_GET['page'], $_GET['sort'])) {
echo 'Оба параметра переданы и не равны null';
}
Когда использовать empty()
- Когда нужно проверить, заполнено ли текстовое поле.
- Когда значения
0,'0',falseи пустой массив действительно должны считаться пустыми. - Когда неважно, существует переменная или просто содержит пустое значение.
$comment = $_POST['comment'] ?? '';
if (empty(trim($comment))) {
echo 'Комментарий пустой';
}
Типичные ошибки
Ошибка 1: проверять числовые поля через empty(). Если ноль допустим, такая проверка сломает логику.
// Плохо: '0' будет считаться ошибкой
if (empty($_POST['price'])) {
echo 'Укажите цену';
}
// Лучше
if (!isset($_POST['price']) || !is_numeric($_POST['price'])) {
echo 'Цена должна быть числом';
}
Ошибка 2: думать, что isset() проверяет непустую строку. Пустая строка существует, поэтому isset('') фактически вернёт true, если значение лежит в переменной.
$title = '';
if (isset($title)) {
echo 'Переменная есть'; // выполнится
}
Рекомендации
- Для наличия переменной или параметра используйте
isset(). - Для проверки пустого текстового поля используйте
trim($value) === ''. - Для наличия ключа массива со значением
nullиспользуйтеarray_key_exists(). - Не применяйте
empty()к числам, если0является нормальным значением. - Для входных данных сначала проверяйте наличие, затем валидируйте тип и диапазон.
Если вы хотите системно разобраться не только с такими базовыми конструкциями, но и с формами, базами данных, безопасностью и реальными проектами, посмотрите курс «PHP и MySQL с Нуля до Гуру 3.0» — практический путь от основ до уверенной разработки.
Итог
Главная разница проста: isset() отвечает на вопрос «существует ли значение и не null?», а empty() — «является ли значение пустым?». Для новичка это может выглядеть мелочью, но именно такие проверки часто влияют на авторизацию, формы, корзины, фильтры и настройки. Используйте их осознанно, особенно когда работаете с нулём, строкой '0' и данными пользователя.
-
Создано 09.09.2026 17:00:48
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.