== sprawdza, czy dwie wartości są równe po tym, jak PHP skonwertuje je do wspólnego typu. === sprawdza, czy są równe i tego samego typu. Dlatego 1 == "1" daje true, a 1 === "1" daje false.
Większość błędów z porównaniami bierze się z tego, że == konwertuje coś, czego się nie spodziewałeś. Dobrym domyślnym wyborem są === i !==, a == tylko wtedy, gdy wiesz, że chcesz konwersji.
Wszystkie operatory porównania w PHP
| Operator | Nazwa | Prawda, gdy |
|---|---|---|
$a == $b | Równe | równe po żonglowaniu typami |
$a === $b | Identyczne | równe i tego samego typu |
$a != $b, $a <> $b | Różne | nierówne po żonglowaniu typami |
$a !== $b | Nieidentyczne | nierówne albo różnych typów |
$a < $b, $a > $b | Mniejsze, większe | |
$a <= $b, $a >= $b | Mniejsze lub równe, większe lub równe | |
$a <=> $b | Spaceship | zwraca -1, 0 albo 1 |
Tabela porównań luźnych i ścisłych
Każdą komórkę tej tabeli obliczyło PHP 8.3. Przełączaj między == i === i kliknij komórkę, aby zobaczyć wyrażenie. Siatka == jest pełna niespodzianek w wierszach dla null, "", "0" i []; siatka === to tylko jej przekątna.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
Jak == porównuje różne typy
Zasady, których przestrzega PHP 8, w kolejności, w jakiej mają znaczenie w praktyce:
- Dwa łańcuchy liczbowe są porównywane jak liczby:
"10" == "1e1"i"1" == "01"dajątrue. - Liczba i łańcuch liczbowy: łańcuch staje się liczbą.
100 == "1e2"dajetrue. - Liczba i łańcuch nieliczbowy: od PHP 8 liczba staje się łańcuchem i porównuje się je jako łańcuchy.
0 == "a"dajefalse(w PHP 7 dawałotrue). - Cokolwiek i bool: obie strony są konwertowane na bool.
"a" == truei[] == falsedajątrue. - null i łańcuch:
nullstaje się"", więcnull == ""dajetrue, alenull == "0"dajefalse. Względem każdego innego typunulljest porównywane jakofalse. - Dwie tablice: są równe, gdy mają te same pary klucz/wartość.
Ostatnia linia pokazuje, dlaczego porównania kolejności z null rzadko mają sens: null staje się false, -1 staje się true, a false < true.
Różne: != vs !==
!= i <> to ten sam operator. !== to wersja ścisła. Różnica ma największe znaczenie przy funkcjach, które zwracają 0 albo false, takich jak strpos:
0 != false daje false, bo 0 konwertuje się na false. 0 !== false daje true, bo int to nie bool. Ta sama pułapka dotyczy array_search i in_array bez flagi strict.
Porównywanie łańcuchów
< i > porównują łańcuchy bajt po bajcie (alfabetycznie dla zwykłego ASCII). Jeśli oba łańcuchy są liczbowe, porównuje się je jak liczby. Do porównania bez rozróżniania wielkości liter albo w porządku „naturalnym” użyj funkcji:
Operator spaceship <=>
$a <=> $b zwraca -1, gdy $a jest mniejsze, 0, gdy są równe, i 1, gdy $a jest większe. Stosuje te same zasady co < i == i jest najkrótszym sposobem zapisu funkcji porównującej do sortowania.
Porównanie dwóch tablic przez <=> porównuje je element po elemencie i właśnie tak funkcja sortuje najpierw po wieku, a potem po imieniu. Więcej przepisów na sortowanie jest na stronie o sortowaniu tablic.
Częsty błąd: porównywanie floatów przez ==
Floaty są przechowywane binarnie, więc wiele wartości dziesiętnych to przybliżenia. 0.1 + 0.2 to nie dokładnie 0.3, a == widzi tę różnicę.
Kwoty pieniężne przechowuj jako całe grosze w liczbach całkowitych i porównuj je przez ===.
Najczęściej zadawane pytania
Czym różni się == od === w PHP?
== konwertuje obie strony do wspólnego typu i dopiero porównuje, więc 1 == "1" daje true. === jest prawdą tylko wtedy, gdy wartości są równe i tego samego typu, więc 1 === "1" daje false. Używaj ===, chyba że chcesz konwersji.
Czy 0 == "a" to prawda w PHP?
Nie od PHP 8. Gdy liczba jest porównywana z łańcuchem, który nie jest liczbowy, PHP 8 porównuje je jako łańcuchy, więc 0 == "a" daje false. W PHP 7 łańcuch był rzutowany na 0 i wynik wynosił true.
Czym różni się != od !== w PHP?
!= (i jego alias <>) to przeciwieństwo ==: jest fałszem, gdy wartości są równe po konwersji typów. !== to przeciwieństwo ===: jest prawdą, gdy wartości lub ich typy się różnią, więc 0 !== false daje true, a 0 != false daje false.
Jak porównać dwie liczby zmiennoprzecinkowe w PHP?
Nie używaj == na wynikach arytmetyki floatów: 0.1 + 0.2 == 0.3 daje false. Zamiast tego porównaj różnicę z małą tolerancją: abs($a - $b) < PHP_FLOAT_EPSILON albo zaokrąglij obie wartości do potrzebnej precyzji.