Menu

Operadores de comparação PHP: == ou === e <=>

O PHP compara valores com == (igual depois da conversão de tipos), === (mesmo valor e mesmo tipo), != e !==, < > <= >= e o operador spaceship <=>. Veja quando o == converte tipos, o que mudou no PHP 8 e todas as comparações frouxas e estritas numa tabela.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

== 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

OperadorNomeVerdadeiro quando
$a == $bIgualiguais depois da conversão de tipos
$a === $bIdênticoiguais e do mesmo tipo
$a != $b, $a <> $bDiferentediferentes depois da conversão de tipos
$a !== $bNão idênticodiferentes, ou de tipos diferentes
$a < $b, $a > $bMenor que, maior que
$a <= $b, $a >= $bMenor ou igual, maior ou igual
$a <=> $bSpaceshipretorna -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.

Comparação frouxa (==) e estrita (===)
Point at or tap a cell to read it as PHP.
$a == $btruefalse10-1"1""0"""null[]"php""10""1e1"
true
false
1
0
-1
"1"
"0"
""
null
[]
"php"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

Como o == compara tipos diferentes

As regras que o PHP 8 segue, na ordem em que importam na prática:

  1. Duas strings numéricas são comparadas como números: "10" == "1e1" e "1" == "01" são ambos true.
  2. Um número e uma string numérica: a string vira número. 100 == "1e2" é true.
  3. 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 (era true no PHP 7).
  4. Qualquer coisa e um bool: os dois lados são convertidos para bool. "a" == true e [] == false são true.
  5. null e uma string: null vira "", então null == "" é true mas null == "0" é false. Contra qualquer outro tipo, null é comparado como false.
  6. 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.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR