Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP5.3?:运算符_Php_Php 5.3 - Fatal编程技术网

使用PHP5.3?:运算符

使用PHP5.3?:运算符,php,php-5.3,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 为什么会显示错误消息?它是PHP5.3;为什么它不回显“1”?这是因为您试图键入未定义的内容:(int)$\u GET['page'] 删除(int)或将typ

使用此测试页:

$page   = (int) $_GET['page'] ?: '1';
echo $page;
当页面未定义时,我不理解得到的输出:

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

为什么会显示错误消息?它是PHP5.3;为什么它不回显“1”?

这是因为您试图键入未定义的内容:(int)$\u GET['page']

删除(int)或将typecast设置在条件行之后。

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

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

即使使用了新样式,您也会遇到
?page=0
(因为
0
计算为false)的问题。“新”并不总是更好。。。你必须知道什么时候使用它

不幸的是,您无法将其用于您希望用于的目的:

表达式expr1?:如果expr1的计算结果为真,则expr3返回expr1,否则返回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);

如果您关心的是膨胀,那么helper函数如何

function get_or($index, $default) {
    return isset($_GET[$index]) ? $_GET[$index] : $default;
}
然后您可以使用:

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

它是干净的,可以处理未定义的值。

尝试这样做:$page=1;如果(!isset($_GET['page']){$page=(int)$_GET['page']?:'1';}echo$page;是 啊“?:运算符对此没有用处。”。。即使“如果不是unset/empty,则返回expr1,否则返回expr2”运算符也很棒,但他们从未添加过该运算符。@Isis:请查看我的答案,以了解为什么不能使用它。@Isis:然后查看我的答案。;)被否决的人至少可以解释原因@Isis:是的,它们是可选的,但它们可以使代码更易于阅读…@Isis:只需添加另一个测试:
(isset($\u GET['page'])&&&$\u GET['page']>0)$_获取['page']:1
(括号现在看起来很好,是吗?))非常不相关,但是您确实想要
1
,而不是
'1'
。在命令行上,这可以很好地打印1:
php-r'echo(int)$foo?:1;'(PHP5.3.3,注意由于错误报告是静默的,所以没有错误)。你能试着运行一下,看看它能做什么吗?它真的说“错误,未定义索引”吗?它是而且一直是一个通知。“错误信息”当然是手写的。您的第一个示例会引发一个错误,如果
页面
索引不存在,不是吗?@DanMan它会引发一个通知。是的,这就是我的意思。谢谢你的澄清。它也不是你描述的那样:作业中总是忽略
后面的部分。您需要PHP7中的null coalesce操作符才能工作,它只是两个赋值表达式与
组合。它或多或少是
($a=0)或($a=1)。如果第一个部分不正确,则忽略第二个
表达式。