PHP null coalesce + троичные операторы странное поведение

Я сталкиваюсь с неожиданным поведением при использовании нового оператора PHP7 null coalesce с тернарным оператором.

Конкретная ситуация (фиктивный код):

function a()
{
$a = 1;
$b = 2;
return $b ?? (false)?$a:$b;
}

var_dump(a());

Результатом является int (1).

Кто-нибудь может объяснить мне, почему?

2

Решение

Ваши пробелы не отражают способ, которым php оценивает выражение. Обратите внимание, что ?? имеет более высокий приоритет чем троичное выражение.

Вы получаете результат:

($b ?? false) ? $a : $b;

Который $a пока $b не является null или оценивает false,

4

Другие решения

Изучите утверждение return $b ?? (false)?$a:$b;

Это сначала оценивает $b ?? (false) чей результат затем передается ? $a:$b;

$b ?? (false) значит дай первым not null and isset значение, которое в этом случае $b

поскольку $b = 2, которое является истинным значением, приведенное выше выражение становится:

вернуть ($b) ? $a : $b который возвращает значение $a который int(1)

Все это будет иметь смысл, если вы будете думать о первоначальном выражении return как:

вернуть ($b ?? (false)) ? $a : $b;

Нам не нужно добавлять дополнительные скобки, потому что ?? оценивается раньше ?

3

return $b ?? (false)?$a:$b; // will return 1

return $b ?? ((false)?$a:$b); // will behave as you wanted
0
По вопросам рекламы [email protected]