只是好奇为什么会引发警告 注意:查询字符串参数“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评估从左到右?而不是整个条件?
答案 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并停止评估。