Elvis vs Null Coalescing: a arma secreta do desenvolvedor PHP

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Elvis vs Null Coalescing: qual a diferença? (Análise aprofundada do PHP)

\n\n

Olá, 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 ??.

\n\n

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\n

Introdução rápida: por que precisamos desses operadores?

\n\n

Imagine 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:

\n\n
if (isset($userName)) {\n    $displayName = $userName;\n} else {\n    $displayName = 'Convidado';\n}
\n\n

Funciona, mas é verboso. O PHP oferece atalhos elegantes. E é aqui que surge o dilema: ?: ou ??? À primeira vista, parecem a mesma coisa. Mas só à primeira vista.

\n\n

1. Operador Elvis (?:) — "O Rei dos valores booleanos"

\n\n

O 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.

\n\n

Sintaxe:

\n
$resultado = $expressao ?: $padrao;
\n\n

O 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.

\n\n

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\n

Exemplo com pegadinha:

\n
$contador = 0;\n$resultado = $contador ?: 10;\necho $resultado; // Exibe 10, e não 0!
\n\n

Por 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.

\n\n

2. Operador Null Coalescing (??) — "O salvador de Notices"

\n\n

O 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\n

Sintaxe:

\n
$resultado = $expressao ?? $padrao;
\n\n

O que significa? O operador verifica se $expressao existe e não é null. Se sim, retorna $expressao. Caso contrário, retorna $padrao.

\n\n

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.

\n\n

Exemplo:

\n
$contador = 0;\n$resultado = $contador ?? 10;\necho $resultado; // Exibe 0! Porque a variável existe e não é null.
\n\n

Percebeu a diferença? Esse é o principal mecanismo "por baixo dos panos".

\n\n

3. Comparação "por baixo dos panos": tabela verdade

\n\n

Vamos organizar tudo em uma tabela clara para fixar. Suponha que

Blogs

Book Recommendations