我在读https://www.php.net/manual/en/language.operators.precedence.php时,&&的绑定比??更紧密吗? ?
为什么设计用来提供可选数组元素的“默认值”的结构不能与该元素紧密绑定?
$ok = $ok && $someArray['optionalElement'] ?? true; // Wrong
$ok = $ok && ( $someArray['optionalElement'] ?? true ); // Right
答案 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']
成为表达式,因此可以按您期望的那样工作。