== 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
| Operatore | Nome | Vero quando |
|---|---|---|
$a == $b | Uguale | uguali dopo la conversione dei tipi |
$a === $b | Identico | uguali e dello stesso tipo |
$a != $b, $a <> $b | Diverso | non uguali dopo la conversione dei tipi |
$a !== $b | Non identico | non uguali, oppure di tipi diversi |
$a < $b, $a > $b | Minore, maggiore | |
$a <= $b, $a >= $b | Minore o uguale, maggiore o uguale | |
$a <=> $b | Spaceship | restituisce -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.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
Come == confronta tipi diversi
Le regole che segue PHP 8, nell'ordine in cui contano nella pratica:
- Due stringhe numeriche vengono confrontate come numeri:
"10" == "1e1"e"1" == "01"sono entrambitrue. - Un numero e una stringa numerica: la stringa diventa un numero.
100 == "1e2"ètrue. - 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 eratrue). - Qualsiasi valore e un bool: entrambi i lati vengono convertiti in bool.
"a" == truee[] == falsesonotrue. - null e una stringa:
nulldiventa"", quindinull == ""ètruemanull == "0"èfalse. Contro qualsiasi altro tipo,nullviene confrontato comefalse. - 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.