例如,变量赋值给if语句

时间:2015-11-05 10:09:48

标签: php operator-precedence

实际上我对运算符优先级有点困惑。

  

以下是与php official website

不匹配的示例
 function getValue($key) {
      $array = ['un' => 1, 'six' => 6];

      if (array_key_exists($key, $array)) {
           return $array[$key];
      }

      return null;
 }

 var_dump(null === $t1=getValue('un'));
 var_dump(null === $t2=getValue('blablablaaaaaa'));
 // And now I switch
 var_dump($t3=getValue('un') ===  null);
 var_dump($t4=getValue('blablablaaaaaa') === null);

输出

 bool(false)
 bool(true)
 // After the switch
 bool(false)
 bool(true)

这不是我期望的两个第一个输出,因为比较优先级高于赋值。因此,php应该尝试比较null === $t1,或者$t1尚未声明,所以警告或错误或者应该提出的任何内容。或者那没发生。 您是否注意到PHP有时会在比较之前处理赋值,尽管比较具有更高优先级,因此应始终在赋值之前执行?。对此有何解释?

我的第二个问题是:是否应该通过始终分割这种表达来避免这种情况?

更新

N.B

 var_dump($t1, $t2, $t3, $t4); 
 // OUTPUT

 int(1)
 NULL
 // After the switch
 bool(false)
 bool(true)

1 个答案:

答案 0 :(得分:2)

=== 非关联

  

Non-associative operators是在表达式中按顺序使用时没有定义行为的运算符。

并在docs

  

=的优先级低于大多数其他运算符,PHP仍然允许使用类似于以下的表达式:if(!$ a = foo()),在这种情况下,foo()的返回值被放置进入$ a。

因此可以假设PHP(在任何表达式中)将首先将函数的返回值赋给变量然后进行比较。