O operador de coalescência nula tem um precedente que é diferente da maioria dos outros comparadores em PHP:
Exemplo 1:
(Incorreto)
$var['x'] = "5";
if ((int)$var['x']??0 < 1 ) {
print "less than 1"; /* outputs this */
}
else {
print "more than 1";
}
Isso resultará em " less
" porque a comparação parece ser entre $var['x']
vs 0<1
, mas certamente seria, o $var['x']??(false)
que ainda não me parece garantir que isso if
seja verdade.
Exemplo 2:
(Incorreto)
$var['x'] = "5";
if ($var['x']??5 < 1 ) {
print "less than 1"; /* still outputs this */
}
else {
print "more than 1";
}
Eu ENTENDO a saída esperada; mas NÃO entendo os passos que o PHP toma para chegar à conclusão escolhida.
Li https://www.php.net/manual/en/language.operators.precedence.php e PHP short-ternary operator ("Elvis") vs null coalescing operator, mas eles não descrevem explicitamente o raciocínio para o que percebo ser um comportamento inesperado nos exemplos 1 e 2.
Quais etapas de processamento lógico fazem com que isso funcione dessa maneira?
Exemplo 3:
( Correto )
$var['x'] = "5";
if ((int)($var['x']??0) < 1 ) {
print "less than 1";
}
else {
print "more than 1";
}
Isso resultará na more
saída " " correta.