Я сталкиваюсь с неожиданным поведением при использовании нового оператора PHP7 null coalesce с тернарным оператором.
Конкретная ситуация (фиктивный код):
function a()
{
$a = 1;
$b = 2;
return $b ?? (false)?$a:$b;
}
var_dump(a());
Результатом является int (1).
Кто-нибудь может объяснить мне, почему?
Ваши пробелы не отражают способ, которым php оценивает выражение. Обратите внимание, что ??
имеет более высокий приоритет чем троичное выражение.
Вы получаете результат:
($b ?? false) ? $a : $b;
Который $a
пока $b
не является null
или оценивает false
,
Изучите утверждение 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;
Нам не нужно добавлять дополнительные скобки, потому что ??
оценивается раньше ?
return $b ?? (false)?$a:$b; // will return 1
return $b ?? ((false)?$a:$b); // will behave as you wanted