Menu

Operatori di confronto PHP: == vs === e <=>

PHP confronta i valori con == (uguali dopo la conversione dei tipi), === (stesso valore e stesso tipo), != e !==, < > <= >= e l'operatore spaceship <=>. Scopri quando == converte i tipi, cosa è cambiato in PHP 8, e vedi ogni confronto stretto e non stretto in un'unica tabella.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

== controlla se due valori sono uguali dopo che PHP li ha convertiti a un tipo comune. === controlla che siano uguali e dello stesso tipo. Quindi 1 == "1" è true, mentre 1 === "1" è false.

La maggior parte dei bug nei confronti nasce da == che converte qualcosa che non ti aspettavi. Una buona scelta predefinita è === e !==, passando a == solo quando sai di volere la conversione.

Tutti gli operatori di confronto PHP

OperatoreNomeVero quando
$a == $bUgualeuguali dopo la conversione dei tipi
$a === $bIdenticouguali e dello stesso tipo
$a != $b, $a <> $bDiversonon uguali dopo la conversione dei tipi
$a !== $bNon identiconon uguali, oppure di tipi diversi
$a < $b, $a > $bMinore, maggiore
$a <= $b, $a >= $bMinore o uguale, maggiore o uguale
$a <=> $bSpaceshiprestituisce -1, 0 o 1

Tabella dei confronti stretti e non stretti

Ogni cella di questa tabella è stata calcolata da PHP 8.3. Passa da == a === e tocca una cella per vedere l'espressione. La griglia di == è piena di sorprese nelle righe di null, "", "0" e []; quella di === è solo la sua diagonale.

Confronto non stretto (==) e stretto (===)
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.

Come == confronta tipi diversi

Le regole che segue PHP 8, nell'ordine in cui contano nella pratica:

  1. Due stringhe numeriche vengono confrontate come numeri: "10" == "1e1" e "1" == "01" sono entrambi true.
  2. Un numero e una stringa numerica: la stringa diventa un numero. 100 == "1e2" è true.
  3. Un numero e una stringa non numerica: da PHP 8, il numero diventa una stringa e vengono confrontati come stringhe. 0 == "a" è false (in PHP 7 era true).
  4. Qualsiasi valore e un bool: entrambi i lati vengono convertiti in bool. "a" == true e [] == false sono true.
  5. null e una stringa: null diventa "", quindi null == "" è true ma null == "0" è false. Contro qualsiasi altro tipo, null viene confrontato come false.
  6. Due array: sono uguali quando hanno le stesse coppie chiave/valore.

L'ultima riga mostra perché i confronti d'ordine con null hanno raramente senso: null diventa false, -1 diventa true, e false < true.

Diverso: != vs !==

!= e <> sono lo stesso operatore. !== è la versione stretta. La differenza conta soprattutto con le funzioni che restituiscono 0 o false, come strpos:

0 != false è false perché 0 si converte in false. 0 !== false è true perché un int non è un bool. La stessa trappola vale per array_search e per in_array senza il suo flag strict.

Confrontare stringhe

< e > confrontano le stringhe byte per byte (in ordine alfabetico per il semplice ASCII). Se entrambe le stringhe sono numeriche, vengono confrontate come numeri. Per un ordine senza distinzione tra maiuscole e minuscole o "naturale" usa le funzioni:

L'operatore spaceship <=>

$a <=> $b restituisce -1 quando $a è più piccolo, 0 quando sono uguali e 1 quando $a è più grande. Usa le stesse regole di < e ==, ed è il modo più breve per scrivere una callback di ordinamento.

Confrontare due array con <=> li confronta elemento per elemento, ed è così che la callback ordina prima per età e poi per nome. Altre ricette di ordinamento sono nella pagina sull'ordinamento degli array.

Errore comune: confrontare float con ==

I float sono memorizzati in binario, quindi molti valori decimali sono approssimazioni. 0.1 + 0.2 non è esattamente 0.3, e == vede la differenza.

Per i soldi, memorizza i centesimi come interi e confrontali con ===.

Domande frequenti

Qual è la differenza tra == e === in PHP?

== converte entrambi i lati a un tipo comune e poi confronta, quindi 1 == "1" è true. === è vero solo quando i valori sono uguali e dello stesso tipo, quindi 1 === "1" è false. Usa === a meno che tu non voglia la conversione.

0 == "a" è vero in PHP?

Non da PHP 8. Quando un numero viene confrontato con una stringa non numerica, PHP 8 li confronta come stringhe, quindi 0 == "a" è false. In PHP 7 la stringa veniva convertita in 0 e il risultato era true.

Qual è la differenza tra != e !== in PHP?

!= (e il suo alias <>) è l'opposto di ==: è falso quando i valori sono uguali dopo la conversione dei tipi. !== è l'opposto di ===: è vero quando i valori o i loro tipi sono diversi, quindi 0 !== false è true mentre 0 != false è false.

Come confronto due float in PHP?

Non usare == sui risultati di calcoli con float: 0.1 + 0.2 == 0.3 è false. Confronta invece la differenza con una piccola tolleranza: abs($a - $b) < PHP_FLOAT_EPSILON, oppure arrotonda entrambi alla precisione che ti interessa.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA