Introdução: A armadilha que todo iniciante enfrenta
\n\nImagine 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?
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\nNeste 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
Pronto? Vamos nessa!
\n\n1. Fundamentos: O que são == e === no PHP?
\n\nAmbos os operadores são usados para comparar dois valores. Mas a abordagem de cada um é fundamentalmente diferente.
\n\nOperador de igualdade (==) — "conversão de tipos permitida"
\nO 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\nOperador de identidade (===) — "tudo deve coincidir"
\nO 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\nAqui 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
2. Exemplo simples: números e strings
\n\nVamos 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\nNo 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\nParece um detalhe, mas é aqui que começam os problemas.
\n\n3. A principal armadilha: "Vazio" e "zero"
\n\nO 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\nVeja 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\nChocante, 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.
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?>