取反空合并运算符(双问号 - ??)

Negated null coalescing operator (double question mark - ??)

我想这样做

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'

您可以将要否定的表达式分组。

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

这是一个 operator precedence 问题。否定的优先级高于空合并,因此它在之前被评估。

所以用这个例子$x = !$a['x'] ?? 'bbb';

我们说 "if !$a['x'] is null then 'bbb'"。好吧,$a['x'] null,因为它是未定义的,但是!$a['x'] 不是 null,它实际上是true(因为!null === true),所以??后面的表达式部分从未被评估。

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


如果是我的话,我会写成

if (empty($result['success'])) {

因为 empty 将同时检查存在性和真实性。