实际上我对运算符优先级有点困惑。
不匹配的示例
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)
答案 0 :(得分:2)
===
非关联。
Non-associative operators是在表达式中按顺序使用时没有定义行为的运算符。
并在docs
=
的优先级低于大多数其他运算符,PHP仍然允许使用类似于以下的表达式:if(!$ a = foo()),在这种情况下,foo()的返回值被放置进入$ a。
因此可以假设PHP
(在任何表达式中)将首先将函数的返回值赋给变量然后进行比较。