运算符优先级&&和?

时间:2019-11-08 23:31:58

标签: php operator-precedence

我在读https://www.php.net/manual/en/language.operators.precedence.php时,&&的绑定比??更紧密吗? ?

为什么设计用来提供可选数组元素的“默认值”的结构不能与该元素紧密绑定?

$ok = $ok && $someArray['optionalElement'] ?? true;      // Wrong
$ok = $ok && ( $someArray['optionalElement'] ?? true );  // Right

1 个答案:

答案 0 :(得分:0)

来自PHP文档

https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

  

对于需要将三元数与isset()结合使用的常见情况,将空合并运算符(??)添加为语法糖。如果它存在且不为NULL,则返回其第一个操作数;否则返回第一个操作数。否则,它将返回其第二个操作数。

由此,空合并器会将剩下的所有内容都视为isset()的表达式自变量

因此$ok && $someArray['optionalElement']被当作完整表达式。

( $someArray['optionalElement'] ?? true )括在括号中只会使$someArray['optionalElement']成为表达式,因此可以按您期望的那样工作。