Looking For Anything Specific?

ads header

Qual é a diferença entre ?? e ?: em PHP?

Operador Ternário no PHP, diminuindo a quantidade de linhas de código

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:

// A retorno será empty $x ?? $y ?? $z ?? 'empty';

Caso não haja valor definido na cadeia de coalescência, uma mensagem "Aviso: Variável indefinida: ..." é exibida.


?: 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)
Espero que tenha ajudado a clarear as idéias, e a economizar linhas de código! Até a próxima!

Postar um comentário

0 Comentários