== vs === em PHP: qual a diferença e por que isso importa?

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

Introdução: A armadilha que todo iniciante enfrenta

\n\n

Imagine a seguinte situação: você está escrevendo seu primeiro script em PHP, verificando se o usuário digitou a senha correta, e usa a condição if ($password == "secret"). Tudo funciona perfeitamente. Mas um mês depois, você percebe um comportamento estranho: if (0 == "off") retorna true, embora sejam duas coisas completamente diferentes. Parece familiar?

\n\n

Bem-vindo ao mundo dos operadores de comparação do PHP. Aqui, o duplo igual (==) e o triplo igual (===) não são apenas símbolos diferentes, mas duas abordagens completamente distintas para comparar valores. Se você não entender a diferença, seu código pode se comportar de forma imprevisível, e os bugs vão se esconder onde você menos espera.

\n\n

Neste artigo, vamos abordar:

\n
    \n
  • Como cada operador funciona "por dentro"
  • \n
  • Por que "123abc" == 123 é true, mas "123abc" === 123 é false
  • \n
  • Quais armadilhas esperam por você (spoiler: são muitas)
  • \n
  • Quando usar cada operador em projetos reais
  • \n
\n\n

Pronto? Vamos nessa!

\n\n

1. Fundamentos: O que são == e === no PHP?

\n\n

Ambos os operadores são usados para comparar dois valores. Mas a abordagem de cada um é fundamentalmente diferente.

\n\n

Operador de igualdade (==) — "conversão de tipos permitida"

\n

O duplo igual (ou comparação não estrita) primeiro converte ambos os operandos para o mesmo tipo e depois compara seus valores. Se os tipos forem diferentes, o PHP automaticamente os converte para um denominador comum. Isso é conveniente, mas perigoso.

\n\n

Operador de identidade (===) — "tudo deve coincidir"

\n

O triplo igual (ou comparação estrita) compara tanto os valores quanto os tipos de dados. Se os tipos forem diferentes — false na hora, sem nenhuma conversão.

\n\n

Aqui está uma tabela simples para memorizar:

\n
    \n
  • $a == $b — os valores são iguais após a conversão de tipos?
  • \n
  • $a === $b — os valores são iguais e os tipos coincidem?
  • \n
\n\n

2. Exemplo simples: números e strings

\n\n

Vamos ver o caso clássico — comparação entre um número e uma string.

\n\n
<?php\n$a = 5;      // integer\n$b = "5";   // string\n\n// Comparação não estrita (==)\nvar_dump($a == $b);  // bool(true) — PHP converte a string "5" para o número 5\n\n// Comparação estrita (===)\nvar_dump($a === $b); // bool(false) — tipos diferentes: integer vs string\n?>
\n\n

No primeiro caso, o PHP pensa: "Ah, um número e uma string. A string "5" pode ser facilmente convertida no número 5, então são iguais". No segundo caso: "Não, integer não é string, false na hora".

\n\n

Parece um detalhe, mas é aqui que começam os problemas.

\n\n

3. A principal armadilha: "Vazio" e "zero"

\n\n

O erro mais comum de iniciantes é a confusão com valores falsos. No PHP, existem vários valores que, em uma comparação não estrita, são considerados iguais entre si, embora semanticamente sejam completamente diferentes.

\n\n

Veja este código:

\n\n
<?php\nvar_dump(0 == false);  // bool(true)  — zero é igual a false\nvar_dump(0 == null);   // bool(true)  — zero é igual a null\nvar_dump(false == null); // bool(true)  — false é igual a null\nvar_dump("" == false); // bool(true)  — string vazia é igual a false\nvar_dump("" == 0);     // bool(true)  — string vazia é igual a zero\n?>
\n\n

Chocante, não? 0 == false é true, "" == 0 também é true. Se você está verificando se o usuário digitou uma senha e escreve if ($password == ""), e depois compara com if ($password == 0) — ambas as condições podem funcionar da mesma forma, embora sejam cenários diferentes.

\n\n

Agora compare com o triplo igual:

\n\n
<?php\nvar_dump(0 === false);  // bool(false)\nvar_dump(0 === null);   // bool(false)\nvar_dump("" === false); // bool(false)\nvar_dump("" === 0);     // bool(false)\n?>

Blogs

Book Recommendations