Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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
PHP&&;操作员_Php - Fatal编程技术网

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两者都不是更好或更差的做法,它们都是等价的语句。这不是关于优先级,而是关于短路。这不是关于优先级,而是关于短路。