取反空合并运算符(双问号 - ??)
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
将同时检查存在性和真实性。
我想这样做
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
将同时检查存在性和真实性。