假设我有一个尚未定义的变量$ var。为什么我不会在这个陈述中出错:
if ( isset($var) && $var ){
// something
} else {
// do something else
}
如果尚未设置,如何检查某些内容是否属实?&& $ var“? isset()是否对if语句执行了某些操作。当然应该回归:
Notice: Undefined variable:$var
答案 0 :(得分:14)
当if语句的第一部分失败时,不会对其余部分进行求值,因为整个语句不能为真。仅当isset
部分为真时,执行才会到达$ var语句。
这是一种标准语言功能,对大多数编程语言来说都很常见。
它被称为“短路评估”,您可以在维基百科上了解更多相关信息:http://en.wikipedia.org/wiki/Short-circuit_evaluation
答案 1 :(得分:2)
这意味着如果&&
运算符的第一个参数为false,则无需计算第二个参数。
答案 2 :(得分:1)
这是因为当isset()
返回false
时,不会评估if语句的其余部分。输入if语句的2部分的顺序是为了使您的代码有效。您是否尝试过转换if语句:
if ($var && isset($var))
{
// something
}
这应该失败。
答案 3 :(得分:1)
&安培;&安培;是short-circuit运算符。这意味着如果表达式的前半部分返回false,则不会处理表达式的其余部分。因此,$ var永远不会进行处理以查看它是否已定义。
答案 4 :(得分:1)
其他人已经指出,&&
运算符是懒惰的。但是这个问题还有另外一点:
如果未在PHP中定义变量,则解释器会对其进行处理,就好像它具有值null
一样。 PHP并不在乎。并且当null
本身作为布尔false
处理时,上面的内容变为有效(布尔)表达式。
<?php
if( $var ) {
echo "something";
} else {
echo "nothing";
}
如果未定义nothing
,不会引发异常,只会回显$var
。
答案 5 :(得分:0)
&amp;&amp;运营商正在短路。这意味着在类似a && b
的表达式中,如果a为false,则不会计算b。因此,在isset($var)
为假的示例中,&& $var
部分将被忽略。
答案 6 :(得分:0)
这是一个常见的解释器/编译器优化,&&
(和)表达式将被计算,直到表达式的一部分为假。使用||
(或)表达式将被评估,直到一个部分为真。
请记住:
false && ?? => false
true && true => true
true && false => false
true || ?? => true
false || true => true
false || false => false
答案 7 :(得分:0)
在PHP(以及许多其他语言)中,逻辑运算符使用short circuit evaluation。这意味着,如果在评估表达式的一部分之后已经确定了表达式的结果,那么其余部分将不再被评估。
在您的示例中,isset($var)
返回false。由于&&
运算符被定义为仅当其子表达式的所有为真时才为真,这意味着如果左子表达式为假,则它不可能为真。因此,不会评估正确的子表达式(并且不会触发错误)。
短路评估非常有用,因为您可以将导致运行时错误的子表达式与另一个确保不会发生这种情况的子表达式相结合。一个例子是你给出的那个。其他语言通常使用类似的 null-save 构造的构造,例如, Java中的if (foo != null && foo.bar == 1)
或C# - foo.bar
如果foo为null将导致异常,但短路评估的优点保证永远不会对其进行评估。