使用PHP 5.3?:运算符

时间:2010-11-17 23:15:31

标签: php 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 个答案:

答案 0 :(得分:12)

正确的方式(在我看来)将是:

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

即使您使用了新样式,也会遇到?page=00评估为false)的问题。 “新”并不总是更好......你必须知道何时才能使用它。

答案 1 :(得分:3)

不幸的是,您不能将它用于您希望用于的目的:

  

Expression expr1?:expr3如果expr1的计算结果为TRUE则返回expr1,否则返回expr3。

所以你仍然需要使用isset或empty() - ?:运算符不包含isset检查。你需要使用的是:

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

答案 2 :(得分:3)

为了完整起见,实现它的另一种方法是提取运营商级别:

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

然而,许多人认为这是不可读的,尽管它比isset()构造更短。

或者如果您正在使用输入对象或任何其他实用程序类:

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

答案 3 :(得分:2)

这是因为你试图对未定义的东西进行类型转换:(int)$ _GET ['page']

删除(int)或在条件行之后设置类型转换。

答案 4 :(得分:1)

如果你担心膨胀,辅助函数怎么样?

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

然后你可以使用:

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

这是干净的并处理未定义的值。