反向或否定的空合并运算符(双问号)?在PHP中

时间:2019-06-24 22:12:24

标签: php-7

我想这样做

if( !$result['success'] ?? false){
... //handle error case

但是它不起作用。为什么不呢?

解决方法是这样:

        $isSuccess = $result['success'] ?? false;
        if((!$isSuccess){
... //handle error case

有更好的解决方法吗?

再现测试:

<?php

$a = [];
$x = !$a['x'] ?? 'bbb';

echo $x;

2个问题。引发通知。并且:回显“ 1”

1 个答案:

答案 0 :(得分:3)

您可以对要否定的表达式进行分组。

if (!($result['success'] ?? false)) {

这是一个operator precedence问题。否定的优先级高于空合并的优先级,因此在进行求值之前就可以对其进行评估。

例如$x = !$a['x'] ?? 'bbb';

我们说的是“如果!$a['x']为空,则'bbb'”。好吧,$a['x'] 为空,因为它没有定义,但是!$a['x'] 不是为空,它实际上是true(因为{ {1}}),所以??之后的表达式部分永远不会被评估。

您看到1是因为它是!null === true的字符串表示形式。


如果是我的,我会改写为

true

因为if (empty($result['success'])) { 将同时检查存在性和真实性。