Основы работы с isset() в PHP

Раздел: Основы PHP -> Переменные и типы данных

Функция isset() в PHP

Основное назначение

Функция isset() определяет, определена ли переменная и не равна ли она null. Она возвращает true, если переменная существует и её значение не null. Если переменная не определена или равна null, возвращается false. Это базовый инструмент для избежания ошибок уровня E_WARNING при обращении к несуществующим переменным.

<?php
$var = 'hello';
if (isset($var)) {
    echo 'Переменная существует';
} else {
    echo 'Переменная не определена или равна null';
}
?>
Переменная существует

Как проверить, что переменная определена и не равна null?

Использование isset() с одним аргументом. Если переменная существует и не null - true. Пример:

<?php
$name = 'Анна';
var_dump(isset($name)); // true

$empty = null;
var_dump(isset($empty)); // false

// неопределённая переменная
var_dump(isset($undefined)); // false
?>

Типичная ошибка

Попытка использовать переменную без проверки приводит к предупреждению Notice: Undefined variable. Использование isset() решает проблему, так как функция не вызывает ошибку при обращении к неопределённой переменной.

Как проверить сразу несколько переменных?

isset() принимает несколько аргументов. Результат true только если все проверяемые переменные существуют и не равны null.

<?php
$a = 1;
$b = 2;
$c = null;

if (isset($a, $b)) {
    echo 'Обе переменные определены и не null';
}

if (isset($a, $b, $c)) {
    echo 'Это не выполнится';
}
?>
Обе переменные определены и не null

Важно: если хотя бы одна из переменных не определена или равна null, isset() возвращает false. Это удобно для валидации форм с несколькими полями.

Как проверить существование ключа массива?

С помощью isset() можно проверять ключи ассоциативных массивов и индексы. Если ключ существует и его значение не null - результат true.

<?php
$arr = ['foo' => 'bar', 'baz' => null];
var_dump(isset($arr['foo'])); // true
var_dump(isset($arr['baz'])); // false (значение null)
var_dump(isset($arr['missing'])); // false (ключ не существует)
?>

Распространённое заблуждение

Некоторые считают, что isset() для ключа массива ведёт себя как array_key_exists(). Но isset() дополнительно проверяет значение на null. Если нужно только существование ключа независимо от значения, следует использовать array_key_exists().

Как отличить isset от empty и is_null?

  • isset($var) - проверяет, что переменная определена и не null.
  • empty($var) - возвращает true для пустых значений ('', 0, '0', null, false, array()). При этом не вызывает ошибку для неопределённых переменных.
  • is_null($var) - возвращает true только если переменная равна null. Для неопределённой переменной выдаёт предупреждение Notice.
<?php
$var = 0;
var_dump(isset($var));   // true
var_dump(empty($var));   // true
var_dump(is_null($var)); // false

$var = null;
var_dump(isset($var));   // false
var_dump(empty($var));   // true
var_dump(is_null($var)); // true
?>

Путаница между этими функциями приводит к логическим ошибкам. Например, проверка if (isset($_POST['submit'])) корректна только если поле отправлено и не равно null. Для проверки отправки формы (даже если поле пустое) лучше использовать $_SERVER['REQUEST_METHOD'] === 'POST'.

Как использовать isset с null coalescing оператором (??)?

Оператор ?? (Null Coalescing) появился в PHP 7. Он возвращает значение первого операнда, если оно не null и существует, иначе второго. Это сокращение от isset() в тернарном выражении.

<?php
$name = $_GET['name'] ?? 'Гость';
// Эквивалентно:
// $name = isset($_GET['name']) ? $_GET['name'] : 'Гость';
echo $name;
?>

Такой подход упрощает код и делает его более читаемым.

Расширенные примеры использования isset()

Ниже представлены подробные примеры с пояснениями и выводом результатов.

Пример 1. Проверка вложенных массивов

Пример
<?php
$data = [
    'user' => [
        'profile' => [
            'name' => 'Иван',
            'age' => null
        ]
    ]
];

// Проверка существования глубокого ключа
if (isset($data['user']['profile']['name'])) {
    echo 'Имя: ' . $data['user']['profile']['name'];
} else {
    echo 'Имя не указано';
}

// Ключ age существует, но равен null
if (isset($data['user']['profile']['age'])) {
    echo 'Возраст указан';
} else {
    echo 'Возраст не указан или равен null';
}

// Проверка несуществующего ключа
if (isset($data['user']['settings']['theme'])) {
    echo 'Тема выбрана';
} else {
    echo 'Тема не выбрана';
}
?>
Имя: Иван
Возраст не указан или равен null
Тема не выбрана

Пример 2. Использование isset в цикле для фильтрации

Пример
<?php
$list = [
    ['id' => 1, 'title' => 'PHP'],
    ['id' => 2],
    ['id' => 3, 'title' => 'JavaScript'],
    ['id' => 4, 'title' => null]
];

$valid = [];
foreach ($list as $item) {
    // Отбираем только те элементы, где title существует и не null
    if (isset($item['title'])) {
        $valid[] = $item;
    }
}
print_r($valid);
?>
Array
(
    [0] => Array
        (
            [id] => 1
            [title] => PHP
        )
    [1] => Array
        (
            [id] => 3
            [title] => JavaScript
        )
)

Пример 3. Сравнение isset и property_exists для объектов

Пример
<?php
class User {
    public $name = 'Алексей';
    public $email = null;
}

$user = new User();

// isset проверяет значение свойства (не только существование)
var_dump(isset($user->name));  // true
var_dump(isset($user->email)); // false (значение null)
var_dump(isset($user->age));   // false (свойство не объявлено)

// property_exists проверяет только существование свойства
var_dump(property_exists($user, 'name'));  // true
var_dump(property_exists($user, 'email')); // true
var_dump(property_exists($user, 'age'));   // false
?>
bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)

Пример 4. Использование isset с выходом за границы массива

Пример
<?php
$numbers = [10, 20, 30];

// Проверка существования индекса
for ($i = 0; $i <= count($numbers); $i++) {
    if (isset($numbers[$i])) {
        echo "Элемент [$i] = {$numbers[$i]}\n";
    } else {
        echo "Элемент [$i] не существует\n";
    }
}
?>
Элемент [0] = 10
Элемент [1] = 20
Элемент [2] = 30
Элемент [3] не существует

Пример 5. Проблема с isset и временными переменными

Пример
<?php
function getValue() {
    echo 'Функция вызвана';
    return 'результат';
}

// isset не вызывает функцию, если переменная не определена?
// На самом деле isset принимает результат вызова функции как аргумент
if (isset(getValue())) {
    echo 'isset сработал';
}
?>
Функция вызвана
isset сработал

Пояснение: isset() может принимать значение, возвращённое функцией. При этом функция выполняется, а isset проверяет получившийся результат (он никогда не будет неопределённым, поэтому результат всегда true). Это не типичный сценарий, но стоит помнить, что isset() не ленив для выражений - они вычисляются.

Пример 6. Комбинирование isset с null coalescing и присваиванием

Пример
<?php
$config = [
    'db' => [
        'host' => 'localhost',
        'port' => 3306
    ]
];

// Использование ?? для установки значения по умолчанию
$host = $config['db']['host'] ?? '127.0.0.1';
$timeout = $config['db']['timeout'] ?? 30;

echo "Host: $host, Timeout: $timeout";
?>
Host: localhost, Timeout: 30

Пример 7. isset и ссылки

Пример
<?php
$a = 1;
$b = &$a;
unset($a);

var_dump(isset($a)); // false
var_dump(isset($b)); // true (ссылка всё ещё существует)
?>
bool(false)
bool(true)

Удаление переменной $a не затрагивает ссылку $b. isset показывает, что $b определена.

Функция isset() в PHP - comments

En
Isset php (php)