Menu

Operatory porównania w PHP: == vs === i <=>

PHP porównuje wartości przez == (równe po żonglowaniu typami), === (równa wartość i ten sam typ), != i !==, < > <= >= oraz operator spaceship <=>. Dowiedz się, kiedy == konwertuje typy, co zmieniło się w PHP 8, i zobacz każde luźne i ścisłe porównanie w jednej tabeli.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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

OperatorNazwaPrawda, gdy
$a == $bRównerówne po żonglowaniu typami
$a === $bIdentycznerówne i tego samego typu
$a != $b, $a <> $bRóżnenierówne po żonglowaniu typami
$a !== $bNieidentycznenierówne albo różnych typów
$a < $b, $a > $bMniejsze, większe
$a <= $b, $a >= $bMniejsze lub równe, większe lub równe
$a <=> $bSpaceshipzwraca -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.

Porównanie luźne (==) i ścisłe (===)
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.

Jak == porównuje różne typy

Zasady, których przestrzega PHP 8, w kolejności, w jakiej mają znaczenie w praktyce:

  1. Dwa łańcuchy liczbowe są porównywane jak liczby: "10" == "1e1" i "1" == "01" dają true.
  2. Liczba i łańcuch liczbowy: łańcuch staje się liczbą. 100 == "1e2" daje true.
  3. Liczba i łańcuch nieliczbowy: od PHP 8 liczba staje się łańcuchem i porównuje się je jako łańcuchy. 0 == "a" daje false (w PHP 7 dawało true).
  4. Cokolwiek i bool: obie strony są konwertowane na bool. "a" == true i [] == false dają true.
  5. null i łańcuch: null staje się "", więc null == "" daje true, ale null == "0" daje false. Względem każdego innego typu null jest porównywane jako false.
  6. 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ