Neste artigo, compararemos e analisaremos os dois operadores condicionais abreviados em PHP, o operador ternário abreviado (?:) e o null coalescing (??).
?: (Elvis)
Desde o PHP 5.3+, podemos usar a sintaxe do operador ternário mais curta, deixando de fora a parte do meio do operador ternário, para uma forma rápida de abreviação:
$x ?: $y;
Essa é a sintaxe abreviada (?:). Observe que as seguintes declarações são equivalentes:
// usando o operador elvis $x ?: $y; // usando o operador ternário $x ? $x : $y; // usando if / else if ($x) { return $x; } else { return $y; }
As declarações acima se traduzem em; se $x for avaliada como verdadeira, retorna $x, caso contrário, retorna $y.
Se um valor falso for encontrado, o operador retornará o segundo valor. Ou, se um valor verdadeiro for encontrado, o primeiro valor (ou seja, o valor verdadeiro) será retornado. Observe, entretanto, que quando o lado esquerdo do operador elvis é avaliado como verdadeiro, o lado direito da expressão não é avaliado. Isso ocorre por causa do "curto-circuito", o que significa que o segundo valor é executado ou avaliado apenas se o primeiro valor não for avaliado como verdadeiro.
É importante lembrar que em PHP os seguintes valores são considerados falsos.
- Boolean false;
- Integer 0;
- Float 0.0;
- String '0' or "0";
- Uma string vazia (i.e. '' or "");
- Um array vazio (i.e. [] or array());
- null;
- Objetos SimpleXML criados a partir de tags vazias.
Observe que as strings "00", "0.0", "\ 0" e "false" são avaliadas como verdadeiro, que é diferente da string '0' ou falso booleano.
Encadeamento ternário
Os ternários podem ser encadeados (ou seja, ele retorna o primeiro valor verdadeiro que encontra), por exemplo:
// retorna 1 echo 0 ?: 1 ?: 2 ?: 3;Isso é o mesmo que escrever uma série de instruções if / elseif / else, por exemplo:
if (expr1) { return expr1; } else if(expr2) { return expr2; } else if(expr3) { return expr3; } else { return expr4; }
Similaridade com outras linguagens
Em certas linguagens de programação (como Perl, Python, Ruby e JavaScript), o operador elvis é escrito como o operador OR (normalmente || ou ou). Isso tem o mesmo comportamento, ou seja, retorna o primeiro operador se for avaliado como verdadeiro ou o segundo caso contrário.
?? (Operador Null Coalescing)
Introduzido no PHP 7, o perador null coalescing tem a seguinte sintax:
// Exemplo do operador $x ?? $y;O que significa que expr1 é retornado quando $x existe e NÃO é nulo; caso contrário, retorna $y. Isso é igual ao seguinte:
// O conteúdo acima é idêntico à essa declaração if/else if (isset($x)) { return $x; } else { return $y; }
// Ou o operador ternario return (isset($x) ? $x : $y);
Para um operador Null Coalescing, a única coisa que importa é que a variável existe e não seja nula, portanto, mesmo valores falsos são aprovados.
Coalescing Encadeado
O coalescing pode ser encadeado, retornando assim o primeiro valor que for encontrador, por exemplo:
?: vs. ??
A tabela abaixo mostra uma comparação lado a lado dos dois operadores em relação a uma determinada expressão:
Expressão | echo ($x ?: 'olá') | echo ($x ?? 'olá') |
$x = ""; | 'olá' | "" |
$x = null; | 'olá' | 'olá' |
$x; | 'olá' (and Notice: Undefined variable: x) | 'olá' |
$x = []; | 'olá' | [] |
$x = ['a', 'b']; | ['a', 'b'] | ['a', 'b'] |
$x = false; | 'olá' | false |
$x = true; | true | true |
$x = 1; | 1 | 1 |
$x = 0; | 'olá' | 0 |
$x = -1; | -1 | -1 |
$x = '1'; | '1' | '1' |
$x = '0'; | 'olá' | '0' |
$x = '-1'; | '-1' | '-1' |
$x = 'random'; | 'random' | 'random' |
$x = new stdClass; | object(stdClass) | object(stdClass) |
0 Comentários