Использование 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);
который является чистым и обрабатывает неопределенные значения.