Отрицательный оператор объединения нулей (двойной знак вопроса - ??) - PullRequest
1 голос
/ 25 июня 2019

Я хочу сделать это

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 проблемы.Бросает уведомление.И: echos '1'

1 Ответ

3 голосов
/ 25 июня 2019

Вы можете сгруппировать выражение, которое вы пытаетесь опровергнуть.

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

Это проблема приоритета оператора .Отрицание имеет более высокий приоритет, чем нулевое слияние, поэтому оно оценивается раньше.

Так что с примером $x = !$a['x'] ?? 'bbb';

Мы говорим: «если !$a['x'] равно нулю, то 'bbb'».Ну, $a['x'] равен null, поскольку он не определен, но !$a['x'] не равен null, на самом деле true (потому что !null === true), поэтому частьвыражение после ??никогда не оценивается.

Вы видите 1, потому что это строковое представление true.


Если бы оно было моим, я бы написал вместо этого как

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

так как empty будет проверять существование и правдивость одновременно.

...