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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Expression expr1?: expr3 возвращает expr1, если expr1 имеет значение TRUE и expr3 в противном случае.

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

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

Ответ 3

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

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

Многие воспринимают это как нечитаемое, хотя оно короче, чем isset().

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

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

Ответ 4

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

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

Ответ 5

Если ваша проблема связана с раздуванием, как насчет вспомогательной функции?

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

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

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

который чист и обрабатывает значения undefined.