== verifica se dois valores são iguais depois que o PHP os converte para um tipo comum. === verifica se eles são iguais e do mesmo tipo. Então 1 == "1" é true, enquanto 1 === "1" é false.
A maioria dos bugs em comparações vem de um == convertendo algo que você não esperava. Um bom padrão é === e !==, passando para == só quando você sabe que quer a conversão.
Todos os operadores de comparação do PHP
| Operador | Nome | Verdadeiro quando |
|---|---|---|
$a == $b | Igual | iguais depois da conversão de tipos |
$a === $b | Idêntico | iguais e do mesmo tipo |
$a != $b, $a <> $b | Diferente | diferentes depois da conversão de tipos |
$a !== $b | Não idêntico | diferentes, ou de tipos diferentes |
$a < $b, $a > $b | Menor que, maior que | |
$a <= $b, $a >= $b | Menor ou igual, maior ou igual | |
$a <=> $b | Spaceship | retorna -1, 0 ou 1 |
Tabela de comparação frouxa e estrita
Cada célula desta tabela foi calculada pelo PHP 8.3. Alterne entre == e === e toque numa célula para ver a expressão. A grade do == está cheia de surpresas nas linhas de null, "", "0" e []; a grade do === é só a diagonal.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
Como o == compara tipos diferentes
As regras que o PHP 8 segue, na ordem em que importam na prática:
- Duas strings numéricas são comparadas como números:
"10" == "1e1"e"1" == "01"são ambostrue. - Um número e uma string numérica: a string vira número.
100 == "1e2"étrue. - Um número e uma string não numérica: desde o PHP 8, o número vira string e os dois são comparados como strings.
0 == "a"éfalse(eratrueno PHP 7). - Qualquer coisa e um bool: os dois lados são convertidos para bool.
"a" == truee[] == falsesãotrue. - null e uma string:
nullvira"", entãonull == ""étruemasnull == "0"éfalse. Contra qualquer outro tipo,nullé comparado comofalse. - Dois arrays: iguais quando têm os mesmos pares chave/valor.
A última linha mostra por que comparações de ordem com null raramente fazem sentido: null vira false, -1 vira true, e false < true.
Diferente: != ou !==
!= e <> são o mesmo operador. !== é a versão estrita. A diferença importa mais com funções que retornam 0 ou false, como strpos:
0 != false é false porque 0 vira false. 0 !== false é true porque um int não é um bool. A mesma armadilha vale para array_search e para in_array sem o parâmetro strict.
Comparar strings
< e > comparam strings byte a byte (em ordem alfabética para ASCII simples). Se as duas strings forem numéricas, elas são comparadas como números. Para ordem sem diferenciar maiúsculas ou ordem "natural", use as funções:
O operador spaceship <=>
$a <=> $b retorna -1 quando $a é menor, 0 quando são iguais e 1 quando $a é maior. Ele usa as mesmas regras de < e ==, e é o jeito mais curto de escrever um callback de ordenação.
Comparar dois arrays com <=> compara elemento por elemento, e é assim que o callback ordena primeiro por idade e depois por nome. Mais receitas de ordenação estão na página sobre ordenar arrays.
Erro comum: comparar floats com ==
Floats são guardados em binário, então muitos valores decimais são aproximações. 0.1 + 0.2 não é exatamente 0.3, e o == enxerga a diferença.
Para dinheiro, guarde centavos inteiros como integers e compare-os com ===.
Perguntas frequentes
Qual a diferença entre == e === no PHP?
== converte os dois lados para um tipo comum e depois compara, então 1 == "1" é true. === só é verdadeiro quando os valores são iguais e do mesmo tipo, então 1 === "1" é false. Use ===, a menos que você queira a conversão.
0 == "a" é verdadeiro no PHP?
Não desde o PHP 8. Quando um número é comparado com uma string que não é numérica, o PHP 8 compara os dois como strings, então 0 == "a" é false. No PHP 7 a string era convertida em 0 e o resultado era true.
Qual a diferença entre != e !== no PHP?
!= (e seu alias <>) é o oposto de ==: é falso quando os valores são iguais depois da conversão de tipos. !== é o oposto de ===: é verdadeiro quando os valores diferem ou os tipos diferem, então 0 !== false é true enquanto 0 != false é false.
Como comparo dois floats no PHP?
Não use == em resultados de aritmética com floats: 0.1 + 0.2 == 0.3 é false. Compare a diferença com uma pequena tolerância: abs($a - $b) < PHP_FLOAT_EPSILON, ou arredonde os dois para a precisão que importa.