Проверка на существование и пустоту в PHP

Александр Кичатов

Часто возникают ситуации, когда нужно проверить существование или пустоту переменной. В PHP для этого есть функции isset(), empty() и array_key_exists().

Проверка существования переменной

Функция isset() возвращает true, если переменная существует и её значение не null:

<?php
    $name = 'Владимир';

    if(isset($name))
        echo 'Имя задано';
    else
        echo 'Имя не задано';

Если передать в isset несколько переменных, она вернёт true при существовании всех переменных:

<?php
    $name = 'Василиса';
    $age = 20;

    echo isset($name, $age) ? 'Василиса есть' : 'Василисы нет';
    echo '<br>';
    echo isset($name, $age, $status) ? 'Василиса есть' : 'Василисы нет';
Результат в браузере:
Василиса есть
Василисы нет

Операторы объединения с NULL

В PHP 7 появился оператор объединения с NULL (или NULL-коалесцентный оператор) ??. Он позволяет получить значение переменной, если она задана и не равна NULL, а иначе - значение по-умолчанию:

<?php
    // Как было раньше
    $name = isset($user_name) ? $user_name : 'Безымянный';

    // Как стало в PHP 7
    $name = $user_name ?? 'Безымянный';

В PHP 7.4 появился присваивающий оператор объединения с NULL ??=.Он позволяет удобно задать значение переменной, если эта переменная ещё не задана (либо равна NULL):

// Как было раньше
$name = $name ?? 'Василий';

// Как стало в PHP 7.4
$name ??= 'Василий';

Проверка на пустоту

Напомню, переменная считается пустой (приводится к false), если она имеет одно из следующих значений:

  • 0 (целое или дробное)
  • '' (пустая строка)
  • '0' (строка с числом 0)
  • [] (пустой массив)
  • null

Функция empty() возвращает true, если переменная не существует или пустая:

<?php
    $name = 'Владимир';

    if(isset($name))
        echo 'Имя задано';
    else
        echo 'Имя не задано';

    // Не забываем про тернарный оператор :)
    echo isset($name) ? 'Имя задано' : 'Имя не задано';

Поведение isset() и empty() сначала может немного запутать: первая возвращает true при существовании переменной, вторая - при не существовании. К этому нужно просто привыкнуть.

На самом деле isset() и empty(), аналогично echo, являются синтаксическими конструкциями, а не функциями.

Функции isset() и empty() гасят ошибку обращения к несуществующей переменной. Это одна из причин, почему они не являются обычными функциями.

ceil($var); // Notice: Undefined variable: var

isset($var); // Ошибки нет

Существование элемента массива

Как мы узнали чуть выше, isset() возвращает false, если переменная существует, но имеет значение null.

Бывают ситуации, когда нам необходимо точно знать, существует ли определённый элемент массива или нет, даже если его значение NULL.

Для этого в PHP существует функция array_key_exists():

<?php
    $arr = [null];

    var_dump(isset($arr[0])); // false
    var_dump(array_key_exists(0, $arr)); // true

Комментарии