PHP&&运营商

时间:2018-06-11 21:03:27

标签: php

只是好奇为什么会引发警告 注意:查询字符串参数“test”未包含在URL

//Notice: Undefined index: test 
if($_GET['test'] === 'somestring' && !empty($_GET['test'])) {
}

//Valid - No Warning.  Why is this Valid? Param 'test' was never given
if(!empty($_GET['test']) && $_GET['test'] === 'somestring') {
}

这是因为PHP评估从左到右?而不是整个条件?

3 个答案:

答案 0 :(得分:2)

if(!empty($_GET['test']) && $_GET['test'] === 'somestring') {

由于您正在使用&&,因此如果任何条件为false,则不会检查其他条件。条件按照他们写的顺序进行检查。从此处开始,第一个条件!empty($_GET['test'])false,下一个条件不评估,因此没有警告。

答案 1 :(得分:1)

在第一个例子中:

//Notice: Undefined index: test 
    if($_GET['test'] === 'somestring' && !empty($_GET['test'])) {
}

在检查变量是否存在之前,您首先尝试访问该变量的值,这是第二个示例基本上正在执行的操作。在检查它不存在之后,它退出条件而不测试第二部分。

答案 2 :(得分:0)

简而言之,它归结为operator precedence 文档显示&&从左到右进行评估,这意味着首先评估子句的左侧部分。在您的情况下,该子句会导致警告。如果你颠倒了你的子句顺序,empty()检查将返回false,那么逻辑将short circuit并停止评估。