关于这种情况我有一个愚蠢的问题。
为什么当我放入括号时,条件的结果改变了?
$std = new 'stdClass();
$std->bool = false;
$resultCond1 = isset($std->bool) and $std->bool == true;
$resultCond2 = (isset($std->bool) and $std->bool == true);
var_dump($resultCond1); // True.
var_dump($resultCond2); // False.
我认为这是由于操作符优先级。
注意,在该表中,赋值操作符牢固地位于and
和&&
之间。以下是我认为发生的事情:
在第一个例子中,isset
返回true, 先于发生的and
操作,赋值正在发生。赋值后,赋值结果为and
'ed, and
操作的结果随即被丢弃。
在第二个示例中,圆括号指示最后进行赋值操作,从而得到预期的结果。
如果完全删除赋值操作,只转储操作本身的结果,可以更清楚地看到这一点:
var_dump(isset($std->bool) and $std->bool == true); // bool(false)
var_dump((isset($std->bool) and $std->bool == true)); // bool(false)
由于运算符优先级的关系,这两个条件输出的结果不相同。
1)对于第一个- isset($std->bool)
返回true,之后它将检查and $std->bool
,最后将结果与true
2)对于第二个-它将分别检查isset($std->bool)
和$std->bool == true
。然后比较这两个结果。
第二个更方便&用更干净的方法来完成这类工作。