Elvis vs Null Coalescing: qual a diferença? (Análise aprofundada do PHP)
\n\nOlá, colega! Se você já programou em PHP, com certeza já passou por aquela situação: precisa verificar se uma variável existe e, se sim, usar seu valor; caso contrário, exibir algo padrão. Parece simples, mas é justamente aqui que muitos desenvolvedores (iniciantes ou não) se confundem com dois operadores muito parecidos, mas essencialmente diferentes: o short-ternary (operador Elvis) ?: e o operador null coalescing ??.
Essa é uma das perguntas mais populares no Stack Overflow (milhares de visualizações e votos). E não é à toa: a diferença entre eles não é apenas acadêmica. Escolher o operador errado pode gerar bugs que você passará horas tentando resolver. Vamos entender de uma vez por todas como eles funcionam "por baixo dos panos" e quando usar cada um.
\n\nIntrodução rápida: por que precisamos desses operadores?
\n\nImagine que você está escrevendo um código para exibir o nome de um usuário. Se o nome não existir, mostramos "Convidado". A forma clássica é usar if:
if (isset($userName)) {\n $displayName = $userName;\n} else {\n $displayName = 'Convidado';\n}\n\nFunciona, mas é verboso. O PHP oferece atalhos elegantes. E é aqui que surge o dilema: ?: ou ??? À primeira vista, parecem a mesma coisa. Mas só à primeira vista.
1. Operador Elvis (?:) — "O Rei dos valores booleanos"
\n\nO operador Elvis (apelidado assim por lembrar o penteado do rei do rock: ?: — olhos, nariz e topete) surgiu no PHP na versão 5.3. É uma forma abreviada do operador ternário.
Sintaxe:
\n$resultado = $expressao ?: $padrao;\n\nO que significa? O interpretador avalia $expressao. Se ela for convertida para true (ou seja, não for um valor "falso"), retorna $expressao. Se $expressao for "falsa" (false, 0, string vazia, null, array vazio, etc.), retorna $padrao.
Detalhe importante: O operador Elvis não verifica se a variável existe. Ele verifica se ela é verdadeira. Se a variável não estiver definida, você receberá um Notice: Undefined index/variable.
\n\nExemplo com pegadinha:
\n$contador = 0;\n$resultado = $contador ?: 10;\necho $resultado; // Exibe 10, e não 0!\n\nPor quê? Porque 0 é um valor "falso" (falsy). O Elvis interpreta que a variável está "vazia" e retorna o valor padrão. Isso pega muita gente de surpresa.
2. Operador Null Coalescing (??) — "O salvador de Notices"
\n\nO operador null coalescing surgiu no PHP 7.0 e foi recebido com entusiasmo. Seu grande poder é trabalhar com segurança com variáveis que não existem, sem gerar erros.
\n\nSintaxe:
\n$resultado = $expressao ?? $padrao;\n\nO que significa? O operador verifica se $expressao existe e não é null. Se sim, retorna $expressao. Caso contrário, retorna $padrao.
Diferença crucial: ?? ignora todos os valores "falsos", exceto null e variáveis indefinidas. 0, "", false — todos são considerados valores válidos e serão retornados.
Exemplo:
\n$contador = 0;\n$resultado = $contador ?? 10;\necho $resultado; // Exibe 0! Porque a variável existe e não é null.\n\nPercebeu a diferença? Esse é o principal mecanismo "por baixo dos panos".
\n\n3. Comparação "por baixo dos panos": tabela verdade
\n\nVamos organizar tudo em uma tabela clara para fixar. Suponha que