PHP&&;操作员
只是好奇为什么会触发警告。PHP&&;操作员,php,Php,只是好奇为什么会触发警告。 注意:URL中不包括查询字符串参数“test” //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']) &&
注意:URL中不包括查询字符串参数“test”
//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从左到右求值吗?而不是整个条件?在第一个示例中:
//Notice: Undefined index: test
if($_GET['test'] === 'somestring' && !empty($_GET['test'])) {
}
您首先尝试访问变量的值,然后再检查它是否存在,这就是第二个示例的基本操作。在检查它不存在后,它退出条件而不测试第二部分。在第一个示例中:
//Notice: Undefined index: test
if($_GET['test'] === 'somestring' && !empty($_GET['test'])) {
}
if(!empty($_GET['test']) && $_GET['test'] === 'somestring') {
您首先尝试访问变量的值,然后再检查它是否存在,这就是第二个示例的基本操作。在检查它不存在后,它退出条件,而不测试第二部分
if(!empty($_GET['test']) && $_GET['test'] === 'somestring') {
因为您正在使用&&
,如果任何条件为false
,则不会检查其他条件。条件按写入顺序进行检查。从这里开始,第一个条件!空($\u GET['test'])
为false
,下一个不计算,因此没有警告
因为您正在使用
&&
,如果任何条件为false
,则不会检查其他条件。条件按写入顺序进行检查。从这里开始,第一个条件!空($\u GET['test'])
为false
,下一个不计算,因此没有警告。简单地说,它归结为。文档显示,
&&
从左到右求值,这意味着首先求值子句的左部分。在您的情况下,该子句将导致警告。如果颠倒子句顺序,则empty()
检查将返回false,然后逻辑将停止计算。简单地说,它归结为。文档显示,从左到右评估
&&&&
的值,这意味着子句的左侧首先进行评估。在您的情况下,该子句将导致警告。如果颠倒子句顺序,empty()
检查将返回false,那么逻辑将停止计算。大多数语言将“短路”逻辑语句以避免不必要的计算&
语句将在第一个false
处停止,|
语句将在第一个true
处停止。在PHP中,您可以使用它编写其他不安全的语句,如第二个示例。@Sammitch“most”?有趣。是否有任何语言可以计算所有结果,而不考虑早期的结果?@mehulmpt不明确,否。是VBA会在继续之前尝试所有语句@Mehulmpt既不是更好的实践,也不是更差的实践,它们都是等价的语句。大多数语言都会“短路”逻辑语句,以避免不必要的计算&
语句将在第一个false
处停止,|
语句将在第一个true
处停止。在PHP中,您可以使用它编写其他不安全的语句,如第二个示例。@Sammitch“most”?有趣。是否有任何语言可以计算所有结果,而不考虑早期的结果?@mehulmpt不明确,否。是VBA会在继续之前尝试所有语句@Mehulmpt两者都不是更好或更差的做法,它们都是等价的语句。这不是关于优先级,而是关于短路。这不是关于优先级,而是关于短路。