isset и empty в PHP: разница, примеры и частые ошибки новичков

isset и empty в PHP: разница, примеры и частые ошибки новичков

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'truefalse
$x = ''truetrue
$x = 0truetrue
$x = '0'truetrue
$x = falsetruetrue
$x = nullfalsetrue
переменной нетfalsetrue

Проверка элементов массива

Чаще всего 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' и данными пользователя.

    Источник

    НЕТ КОММЕНТАРИЕВ

    Оставить комментарий