我有一个关于这种情况的愚蠢问题。
为什么当我放括号时,条件的结果会发生变化?
$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.
答案 0 :(得分:3)
我认为这是由于operator precedence。
请注意,该表中的赋值运算符位于and
和&&
之间。以下是我的想法:
在第一个示例中,isset
返回true,并且之前返回正在进行分配的and
操作。在分配之后,分配的结果为and
,然后立即丢弃该and
操作的结果。
在第二个例子中,括号表示赋值发生在最后,所以你得到了预期的结果。
如果你完全删除赋值操作并且只是转储操作的结果,你可以更清楚地看到这一点:
var_dump(isset($std->bool) and $std->bool == true); // bool(false)
var_dump((isset($std->bool) and $std->bool == true)); // bool(false)
答案 1 :(得分:3)
由于运算符优先级,这两个条件都不会输出相同的结果。
1)对于第一个 - isset($std->bool)
返回true,之后它将检查and $std->bool
,最后它会将该结果与true
进行比较
2)对于第二个 - 它将分别检查isset($std->bool)
和$std->bool == true
。然后比较这两个结果。
第二个更方便&更简洁的方式来完成这种类型的工作。