Использование PHP 5.3?: Оператор

С этой тестовой страницей:

$page   = (int) $_GET['page'] ?: '1';
echo $page;

Я не понимаю вывод, который я получаю, когда страница не определена:

Request   Result
?page=2   2
?page=3   3
?page=    1
?         error: Undefined index page

Почему сообщение об ошибке? Это PHP 5.3; почему не отображается "1"?

5 ответов

Решение

Правильный путь (на мой взгляд) будет:

$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;

Даже если вы используете новый стиль, у вас будут проблемы с ?page=0 (как 0 оценивается как ложное). "Новое" не всегда лучше... Вы должны знать, когда его использовать.

К сожалению, вы не можете использовать его в целях, для которых вы хотите его использовать:

Выражение expr1?: Expr3 возвращает expr1, если expr1 оценивается как TRUE, и expr3 в противном случае.

Так что вам все равно придется использовать isset или empty() - ?: Оператор не включает проверку isset. Что вам нужно использовать это:

$page = !empty($_GET['page']) ? (int)$_GET['page'] : 1;

Просто для полноты, другой способ достичь этого - получить операторский ранг:

 $page = (int)$_GET["page"]  or  $page = 1;

Однако многие люди воспринимают это как нечитабельное, хотя оно короче, чем конструкции isset().

Или, если вы используете входные объекты или любой другой служебный класс:

 $page = $_GET->int->default("page", 1);

Это потому, что вы пытаетесь ввести что-то неопределенное: (int) $_GET['page']

Удалите (int) или установите тип-тип после условной строки.

Если вы беспокоитесь, как насчет вспомогательной функции?

function get_or($index, $default) {
    return isset($_GET[$index]) ? $_GET[$index] : $default;
}

тогда вы можете просто использовать:

$page = get_or('page', 1);

который является чистым и обрабатывает неопределенные значения.

Другие вопросы по тегам