PHP Неопределенный индекс с использованием троичного оператора - PullRequest
2 голосов
/ 19 мая 2011

моя версия PHP 5.3.5.

Код:

$num = $_REQUEST['num'] ?: 7;

Ошибка:

Notice: Undefined index: num in C:\path\to\file.php on line 34

Есть предложения?

Ответы [ 7 ]

8 голосов
/ 19 мая 2011
$num = isset($_REQUEST['num']) ? $_REQUEST['num'] : 7;

Я предполагаю, что вы хотите $_REQUEST['num'], если он установлен иначе 7.

5 голосов
/ 19 ноября 2011

Не хорошо ли использовать подавление ошибок для короткого кода назначения?

мы можем написать $ price = @ $ rec ['Product'] ['new']?: $ Rec ['Product'] ['old'];

Использование @ спасло меняот повторения одной и той же переменной и позволил мне использовать сокращенный троичный оператор без уведомления.

Я знаю, что использование @ считается плохим, но в данном конкретном случае я не думаю, что что-то могло пойти не так.

Спасибо.

5 голосов
/ 19 мая 2011

Это ожидаемое поведение;в соответствии с http://bugs.php.net/bug.php?id=45760, ярлык ?: является просто ярлыком.

Другими словами:

$num = $_REQUEST['num'] ?: 7;

оценивается идентично:

$num = $_REQUEST['num'] ? $_REQUEST['num'] : 7;

и все, что подразумевается (и рассматривается вполне адекватно другими ответами в ветке).

2 голосов
/ 12 февраля 2012

Я второй давал решение использовать @ подавление ошибок, что более читабельно:

$ num = @ $ _ REQUEST ['num']?: 7;

.. или ..

$ num = (array_key_exists ('num', $ _REQUEST))?$ _REQUEST ['num']: 7;

Я знаю, что предпочел бы прочитать, если бы пытался понять чужой код.Я думаю, что он обеспечивает счастливую середину между установкой error_reporting в E_ALL & ~ E_NOTICE (очень плохо) и приведенным выше шаблоном кода.

2 голосов
/ 19 мая 2011

Если его нет в запросе, вы можете получить предупреждение.

Вам лучше сделать это:

$num = (array_key_exists('num', $_REQUEST)) ? intval($_REQUEST['num']) : 7;
1 голос
/ 19 мая 2011

Доступ к массиву с индексом, который не существует, всегда вызывает уведомление. Вам нужно либо игнорировать уведомление, так как оно возвращает null, либо технически вы должны использовать array_key_exists.

1 голос
/ 19 мая 2011

$num = (isset($_REQUEST['num'])) ? $_REQUEST['num'] : 7;

...