Глиф Учебники

Undefined variable и Undefined array key

Справочник · PHP · 2 минуты чтения

Текст
Warning: Undefined variable $name in /var/www/html/index.php on line 5
Warning: Undefined array key "email" in /var/www/html/index.php on line 8

Первое значит: на строке 5 читается переменная $name, которой ещё не присвоили значение. Второе: в массиве нет ключа email. PHP подставит вместо значения null и продолжит работу, но результат почти наверняка не тот, что задуман.

В PHP 7 те же сообщения выглядели как Notice: Undefined variable: name, Notice: Undefined index: email и Undefined offset: 3. В PHP 8 это предупреждения (Warning) с новым текстом, а смысл тот же.

Поле формы или параметр адреса

Самый частый случай — форма ещё не отправлена или поле не пришло. Задайте значение по умолчанию оператором ??:

PHP
<?php
$email = $_POST['email'] ?? '';
$page = (int) ($_GET['page'] ?? 1);
$agree = isset($_POST['agree']);

?? берёт левое значение, если оно существует и не null, иначе — правое, и при этом не выдаёт предупреждения. Неотмеченный флажок (checkbox) браузер не отправляет вовсе, поэтому его проверяют через isset.

Переменная не создана

PHP
<?php
$total = 0;
foreach ([5, 10, 15] as $price) {
    $total += $price;
}
echo $total . "\n";
Вывод
30

Без строки $total = 0; первая же попытка прибавить к $total дала бы Undefined variable $total. Создавайте переменную до цикла или условия, где она меняется. То же с переменной, которая задаётся только внутри if: если условие не выполнилось, переменной нет.

Другие причины

Если забыт знак $

Текст
Fatal error: Uncaught Error: Undefined constant "name"

Это другая ошибка: echo name; без $ PHP читает как константу. В PHP 8 такая ошибка останавливает программу.

isset или array_key_exists

isset($a['key']) возвращает false, если ключа нет или значение равно null. Если важно отличить «ключа нет» от «ключ есть, значение null», нужна array_key_exists('key', $a). Подробнее о проверках — в справке isset, empty и ??.

Не прячьте предупреждение

Знак @ перед выражением (@$_POST['email']) или error_reporting(0) уберут сообщение, но не ошибку: в переменной всё равно окажется null, и программа будет работать неправильно молча. Исправляйте причину — так сэкономите часы поиска странного поведения потом.