W języku PHP dostępnych jest 10 operatorów porównań, za pomocą których można porównywać wartości różnego typu. Sposób ich użycia w większości przypadków jest oczywisty. Jednak język PHP ma to do siebie, że czasami lubi zaskakiwać.
Czy wiesz na przykład, co się stanie, kiedy porównasz liczbę z łańcuchem? Albo czy wiesz, co operatory porównań PHP mają wspólnego ze statkami kosmicznymi? Jeśli nie, to czytaj dalej.
Tutaj dowiesz się wszystkiego, co trzeba wiedzieć na temat porównywania wartości różnego typu w PHP. Między innymi znajdziesz odpowiedzi na następujące pytania:
- Czym są operatory porównań PHP?
- Jakie są operatory porównań w PHP?
- Jak porównywać wartości w PHP?
- Jaka jest różnica między
==
a===
w PHP? - Co oznacza operator
!=
w PHP, a co oznacza!==
? - Co to jest statek kosmiczny w PHP?
- Jak porównywać liczby zmiennoprzecinkowe w PHP?
Ponadto poznasz dwa dodatkowe operatory, które nie są ściśle zaliczane do kategorii operatorów porównań, ale mają podobne zastosowanie. Pierwszy z nich to jedyny w PHP operator trójargumentowy (nazywany też Elvisem), a drugi ma tajemniczo brzmiącą nazwę operator koalescencji null. Masz ochotę na przygodę z muzyczną nutką w tle?
Czym są operatory porównań PHP
Operatory porównań PHP (zwane też operatorami relacyjnymi) to operatory służące do porównywania różnych wartości i zwracające wynik logiczny określający zachodzącą między nimi relację.
Za ich pomocą można na przykład dowiedzieć się, czy dana liczba jest większa, czy mniejsza od innej, czy dwie wartości są identyczne zarówno pod względem wartości, jak i typu albo czy dany łańcuch występuje przed czy za innym łańcuchem w kolejności alfabetycznej.
Poniższa tabela zawiera zwięzłe zestawienie wszystkich operatorów porównań PHP z krótkimi objaśnieniami. W dalszej części rozdziału znajdują się bardziej szczegółowe opisy.
Operator | Nazwa | Przykład | Sposób działania |
---|---|---|---|
== | Równość | $a == $b | Zwraca true , jeśli wartości $a i $b są równe (niezależnie od typu) |
=== | Równość ścisła (identyczność) | $a === $b | Zwraca true , jeśli $a i $b są równe zarówno pod względem wartości, jak i typu |
!= , <> | Nierówność (różność) | $a != $b | Zwraca true , jeśli wartości $a i $b są różne (niezależnie od typu) |
!== | Nierówność ścisła | $a !== $b | Zwraca true , jeśli wartości $a i $b są różne lub są różnego typu |
< | Mniejszość | $a < $b | Zwraca true , jeśli wartość $a jest mniejsza od $b |
> | Większość | $a > $b | Zwraca true , jeśli wartości $a jest większa od $b |
<= | Mniejszość lub równość | $a <= $b | Zwraca true , jeśli wartości $a jest mniejsza od $b lub jest jej równa |
>= | Większość lub równość | $a >= $b | Zwraca true , jeśli wartości $a jest większa od $b lub jest jej równa |
<=> | Statek kosmiczny | $a <=> $b |
|
?: | Operator trójargumentowy | $a > 0 ? x : y | Zwraca x , jeśli wartość $a jest większa od 0, lub y w przeciwnym przypadku |
?? | Operator koalescencji null | $a ?? "dwa kilogramy niczego" | Zwraca łańcuch "dwa kilogramy niczego" , jeśli $a ma wartość null ; lub zwraca wartość $a w przeciwnym przypadku |
Operatory porównań PHP działają różnie w zależności od tego, jakiego typu są ich argumenty.
Jeśli na przykład oba argumenty operatora porównywania są liczbami całkowitymi, to wykonuje on zwykłe porównywanie numeryczne.
Jeśli oba argumenty są łańcuchami niereprezentującymi liczb, to operator porównywania wykonuje porównywanie leksykograficzne, czyli alfabetyczne.
Oprócz tego argumentami operatorów porównań mogą być między innymi liczby zmiennoprzecinkowe, obiekty, tablice, zasoby, wartości logiczne. W poniższej tabeli przedstawiam sposób działania operatorów porównań w zależności od typu ich argumentów.
Typ argumentu 1 | Typ argumentu 2 | Opis |
---|---|---|
Liczba | Liczba | Porównywanie numeryczne |
Liczba | Łańcuch reprezentujący liczbę | Porównywanie numeryczne (zobacz przykład porównywania liczby z łańcuchem reprezentującym liczbę) |
Łańcuch reprezentujący liczbę | Łańcuch reprezentujący liczbę | Porównywanie numeryczne |
Liczba | Łańcuch niereprezentujący liczby | Porównywanie leksykograficzne (alfabetyczne) |
Łańcuch niereprezentujący liczby | Łańcuch niereprezentujący liczby | Porównywanie leksykograficzne |
null | łańcuch | Konwertuje null na pusty łańcuch "" i wykonuje porównywanie numeryczne lub leksykograficzne |
bool lub null | Jakikolwiek inny typ | Konwertuje obie strony na bool , false < true (Zobacz Konwersja wartości na typ logiczny) |
Tablica | Tablica | Tablica, która ma mniej elementów, jest mniejsza. Tablice są porównywane wartość do wartości, ale pod warunkiem, że mają identyczne klucze. Brak klucza z pierwszej tablicy w drugiej tablicy oznacza, że struktury są nieporównywalne (więcej na ten temat dowiesz się w rozdziale poświęconym pracy z tablicami) |
Operatory równości: == i ===
Zarówno operator ==
(ang. equality) jak i ===
(ang. identity) służą do sprawdzania, czy jedna wartość jest równa drugiej, ale różnią się jednym szczegółem działania.
Operator ==
sprawdza, tylko, czy oba jego argumenty mają taką samą wartość bez względu na typ. Natomiast operator ===
oprócz wartości sprawdza też typy. Spójrz na poniższe przykłady:
var_dump(10 == "10"); // Wynik: bool(true)
var_dump(10 === "10"); // Wynik: bool(false)
W dwóch pierwszych przykładach porównujemy wartość typu int (10
) z wartością typu string
("10"
). Dzięki automatycznej konwersji typów w PHP w pierwszym przypadku łańcuch zostanie przekonwertowany na liczbę. W efekcie w rzeczywistości zostanie wykonane wyrażenie: 10 == 10
, którego wartością jest oczywiście true
.
W drugim przypadku operator ===
wyklucza automatyczną konwersję typów. A liczba 10
nie jest równa łańcuchowi "10"
, w związku z czym otrzymujemy wartość false
. A teraz spójrz na to:
var_dump(10 == 10.0); // Wynik: bool(true)
var_dump(10 === 10.0); // Wynik: bool(false)
W tym przykładzie mamy liczbę typu int i liczbę typu float
. Ich wartości są jednakowe, więc operator ==
zwraca true
. Różnią się one jednak typem, dlatego operator ===
zwraca false
. I jeszcze jeden przykład:
var_dump(true == 1); // Wynik: bool(true)
var_dump(true === 1); // Wynik: bool(false)
Te dwie instrukcje porównują wartość logiczną true
z wartością typu int 1
. W PHP wszystkie liczby większe od zera w kontekście logicznym są interpretowane jako true
, dlatego operator ==
zwrócił true
w tym przypadku. Ponieważ jednak wartości te różnią się typami, operator ===
zwrócił wartość false
.
Czasami konwersje typów potrafią zaskoczyć programistę, dlatego w wielu przypadkach zaleca się używanie operatora ===
(i !==
opisanego poniżej).
Operatory nierówności: != (<>) i !==
Operatory nierówności (!=
i <>
— ang. inequality) i nierówności ścisłej (!==
— ang. not identical, strict inequality) działają według tych samych zasad, co operatory równości i równości ścisłej PHP, tylko odwrotnie.
Operatory !=
i <>
zwracają wartość true
, gdy ich argumenty różnią się tylko wartością, natomiast operator !==
zwraca true
, gdy jego argumenty różnią się wartością lub typem.
Spójrz na poniższe przykłady użycia operatora PHP !=
:
var_dump(5 != 5); // Wynik: bool(false)
var_dump(5 != "5"); // Wynik: bool(false)
var_dump(5 != 5.0); // Wynik: bool(false)
Operator !=
można odczytywać jako pytanie w rodzaju — „Czy te dwie wartości są różne?”. Odpowiedź false
oznacza „Nie są różne”, a odpowiedź true
, oznacza „Tak, są różne”.
We wszystkich powyższych przykładach otrzymaliśmy odpowiedź negatywną, co oznacza, że dla operatora PHP !=
między 5
, "5"
i 5.0
nie ma różnicy.
A teraz spójrz na przykłady użycia operatora !==
:
var_dump(5 !== 5); // Wynik: bool(false)
var_dump(5 !== "5"); // Wynik: bool(true)
var_dump(5 !== 5.0); // Wynik: bool(true)
Ten operator bierze pod uwagę nie tylko wartość, ale też typ, więc dla niego 5
różni się od "5"
i od 5.0
.
Operatory różności: <, >, <= i >=
Operatory większości i mniejszości (<
i >
— ang. less than i greater than) porównują pierwszy argument z drugim i zwracają wartość logiczną, która wskazuje, jaka jest relacja między ich wartościami.
W przypadku liczb stosują one oczywiście porządek numeryczny, np.:
var_dump(5 < 6); // Wynik: bool(true)
var_dump(5 > 6); // Wynik: bool(false)
Operatory te w razie potrzeby i możliwości wykonują konwersje automatyczne, np. zamieniają łańcuchy reprezentujące liczby na liczby:
var_dump(5 < "6"); // Wynik: bool(true)
Z kolei w odniesieniu do łańcuchów operatory te wykonują porównywanie leksykograficzne, czyli w uproszczeniu można powiedzieć, że alfabetyczne, np.:
var_dump("a" < "d"); // Wynik: bool(true)
Zgodnie z porządkiem alfabetycznym, wcześniejsze miejsce w alfabecie jest uznawane za mniejsze od dalszego. Dlatego w tym przykładzie otrzymaliśmy w wyniku wartość true
.
A co z innymi typami niż liczbowe i łańcuchowe?
- Jeśli chodzi o wartości logiczne, to
false
jest traktowana jako mniejsza odtrue
. - Jeśli znajdziesz się w rzadkiej sytuacji, w której będziesz musiał porównać obiekt z wartością innego typu, to obiekt zawsze jest większy.
- Podobnie jest z tablicami. Tablica porównywana z wartością innego typu zawsze jest większa. Chyba że jest to obiekt, wtedy obiekt wygrywa.
- Z kolei wartość
null
lubbool
porównywana z wartością innego typu powoduje, że oba argumenty zostają przekonwertowane na typ logiczny i zostaje wykonane porównywanie wartości logicznych.
Operatory <=
(mniejszy lub równy — ang. less than or equal to) i >=
(większy lub równy — ang. greater than or equal to) różnią się od swoich wersji bez znaku równości tylko tym, że uwzględniają także wartości graniczne, np.:
var_dump(7 < 7); // Wynik: bool(false)
var_dump(7 <= 7); // Wynik: bool(true)
Operator <=> (statek kosmiczny)
Operator PHP <=>
(statek kosmiczny — ang. spaceship) różni się od poprzednich operatorów ważną cechą: zwraca wartość typu int
, a konkretnie -1
, 0
lub 1
. Jest więc czymś pośrednim między operatorem logicznym, a instrukcją warunkową (niedługo poznasz wszystkie instrukcje warunkowe PHP).
Opis tekstowy tego operatora może wydawać się zawiły, ale staje się on o wiele prostszy, jeśli wyobrazimy sobie, że tworzące go znaki są umieszczone nad osią liczbową.

W każdym przypadku rozważamy stosunek pierwszego argumentu do drugiego.
- Jeśli pierwszy argument jest mniejszy od drugiego, to bierzemy wynik wskazywany przez „ramię” zwrócone w kierunku ujemnej nieskończoności (czyli
-1
). - Jeśli pierwszy argument jest równy drugiemu, to bierzemy wynik wskazywany przez znak równości (czyli
0
). - A jeśli pierwszy argument jest większy od drugiego, to bierzemy wynik wskazywany przez ramię wskazujące w kierunku dodatniej nieskończoności (czyli
1
).
Poniżej znajduje się parę przykładów użycia operatora PHP <=>
:
var_dump(5 <=> 7); // Wynik: int(-1)
var_dump("8" <=> 7); // Wynik: int(1)
var_dump(true <=> false); // Wynik: int(1)
var_dump(null <=> true); // Wynik: int(-1)
var_dump(5 <=> 5); // Wynik: int(0)
Operator trójargumentowy
Operator trójargumentowy PHP (ang. ternary operator) jest niezwykły pod paroma względami.
Po pierwsze jest to jedyny w PHP operator, który przyjmuje trzy argumenty.
Po drugie w pełni realizuje on funkcjonalność instrukcji warunkowych i dlatego jego druga nazwa to operator warunkowy (ang. conditional operator).
Po trzecie, chyba jako jedyny operator ma aż trzy nazwy, bo potocznie bywa nazywany Elvisem (ang. Elvis operator). Zatem jest to nie tylko operator trójargumentowy, ale też trójnazwowy…
A skąd taka niezwykła nazwa? Komuś się skojarzyło, że operator ten przypomina kształtem twarz Elvisa Presleya. Spójrz na poniższą ilustrację i oceń sam, czy to właściwe skojarzenie.

Skoro już wiesz wszystko na temat bogatego nazewnictwa operatora ?:
, pora dokładniej przyjrzeć się temu, jak działa. W ogólnej postaci wygląda on tak:
wyr1 ? wyr2 : wyr3
Operator ten zawsze zaczyna od sprawdzenia, jaką wartość logiczną ma wyrażenie 1. Jeśli true
, to zwraca wartość wyrażenia 2, a jeśli false
, to zwraca wartość wyrażenia 3. Na przykład:
$a = 10;
$b = 5;
echo $a > $b ? 'Zmienna $a jest większa.' : 'Zmienna $b jest większa.';
W tym przypadku otrzymamy następujący wynik:
Zmienna $a jest większa.
Teraz przejdziemy do kolejnego operatora o dość niezwykłej nazwie.
Operator koalescencji null
Operator koalescencji null (ang. null coalescing operator), nazywany też po polsku operatorem łączenia null, a także operatorem łączenia zerowego, choć ma straszną nazwę, to w rzeczywistości jest łagodny jak baranek. Jego ogólna postać wygląda tak:
wyr1 ?? wyr2;
Jeśli wyrażenie 1 jest null
, to operator ??
zwraca wartość wyrażenia 2. W przeciwnym przypadku zwraca wartość wyrażenia 1. Spójrz na poniższy przykład:
echo $email ?? "Brak adresu e-mail.";
Jeśli wcześniej została zdefiniowana zmienna $email
i nadano jej wartość, na przykład przesłaną z pola formularza HTML, to zostanie zwrócona wartość tej zmiennej. W przeciwnym przypadku zostanie zwrócony łańcuch "Brak adresu e-mail"
.
To był ostatni operator w tym rozdziale. Na zakończenie jeszcze tylko parę słów na temat porównywania liczb zmiennoprzecinkowych w PHP i będziemy mogli przejść do podsumowania.
Porównywanie liczb zmiennoprzecinkowych w PHP
Podstawowa zasada dotycząca pracy z liczbami zmiennoprzecinkowymi w PHP brzmi: Nigdy nie porównuj liczb zmiennoprzecinkowych. Jest to związane z problematyczną kwestią precyzji reprezentacji liczb zmiennoprzecinkowych w pamięci komputera.
Jak więc porównywać liczby zmiennoprzecinkowe, skoro nie można ich porównywać? Jest na to kilka sposobów. Poniżej opisuję dwa najprostsze i najczęściej stosowane.
Użycie funkcji bccomp()
Za pomocą funkcji bccomp()
można porównać dwie liczby o dowolnej precyzji. Jako argumenty wywołania należy jej przekazać obie wartości w postaci łańcucha oraz opcjonalnie liczbę całkowitą określającą liczbę cyfr po znaku dziesiętnym, jaka ma zostać uwzględniona.
Funkcja ta zwraca -1
, jeśli drugi argument jest większy, 0
jeśli argumenty są równe, oraz 1
jeśli pierwszy argument jest większy.
Spójrz na poniższy przykład:
$a = 0.1 + 0.1 + 0.1;
$b = 0.3;
var_dump($a == $b); // Wynik: bool(false)
echo bccomp($a, $b, 3); // Wynik: 0
Zwykłe porównanie wartości zmiennych $a i $b za pomocą operatora ==
dało „zaskakujący” wynik fałszywy, choć wiemy, że powinno być odwrotnie.
Natomiast funkcja bccomp()
zwróciła poprawny wynik — 0
oznacza, że porównywane wartości są równe.
Drugim często stosowanym sposobem na „porównywanie” wartości zmiennoprzecinkowych jest użycie tzw. wartości epsilon.
Wartość epsilon
Epsilon to, mówiąc najkrócej największa akceptowalna różnica między wartościami. Granica, do której dwie wartości będziemy uznawać za równe. Należy ją zdefiniować samodzielnie, dobierając wartość odpowiadającą poziomowi dokładności, na jakiej nam zależy.
Spójrz na poniższy przykład:
$epsilon = 0.00000001; // 1 na 8 miejscu po kropce
$a = 0.000000123; // Różnica na 9 miejscu po kropce
$b = 0.000000122;
var_dump(abs($a - $b) < $epsilon); // bool(true)
Wartość true
oznacza, że różnica między wartościami zmiennych $a i $b jest mniejsza niż maksymalna dopuszczalna przez nas różnica, a więc uznajemy je za równe. W kodzie możemy to wykorzystać na przykład tak:
$epsilon = 0.00000001;
$a = 0.000000123;
$b = 0.000000122;
abs($a - $b) < $epsilon ? "Wartości są równe, robimy coś z nimi." : "Wartości są różne, też coś z nimi robimy.";
Podsumowanie

- W języku PHP dostępnych jest 10 operatorów porównań:
==
,===
,!=
,<>
,!==
,<
,>
,<=
,>=
oraz<=>
. - W języku PHP dostępny jest jeden operator trójargumentowy —
?:
. - W języku PHP dostępny jest operator koalescencji
null
w postaci??
. - Operator PHP
<=>
bywa potocznie nazywany statkiem kosmicznym. - Operator PHP
?:
bywa potocznie nazywany Elvisem. - W niektórych przypadkach za pomocą operatorów porównań PHP można porównywać wartości różnego typu, ponieważ PHP dokonuje konwersji automatycznych.
- Porównywanie liczb z łańcuchami reprezentującymi liczby jest wykonywane tak, jak na liczbach.
- Łańcuchy znaków niereprezentujące liczb są porównywane w porządku leksykograficznym.
- Jeśli jednym argumentem porównania jest wartość typu
null
lubbool
, to oba argumenty są konwertowane na typbool
. - Tablice są porównywane element po elemencie.
- Wartości zmiennoprzecinkowych nie należy porównywać bezpośrednio.
- Do porównywania wartości zmiennoprzecinkowych w PHP można używać funkcji
bccomp()
lub techniki z wykorzystaniem wartości epsilon.
Pytania
- Jakie znasz operatory porównań w języku PHP?
- Jak wygląda i jak działa operator trójargumentowy PHP?
- Jak wygląda i jak działa operator koalescencji
null
PHP? - Który operator PHP bywa potocznie nazywany statkiem kosmicznym?
- Który operator PHP bywa potocznie nazywany Elvisem?
- Czy w PHP można porównywać wartości różnego typu?
- Jakie są najważniejsze zasady porównywania wartości różnego typu w PHP?
- W jaki sposób operatory porównań PHP porównują łańcuchy znaków niereprezentujące liczb?
- Jak należy porównywać wartości zmiennoprzecinkowe w PHP?
Ćwiczenia
- Porównaj za pomocą PHP te dwie liczby: 3,1415925 i 3,1415926.
- Sprawdź która jest teraz godzina. Przy użyciu odpowiedniego operatora PHP napisz instrukcję, która zwraca
-1
, jeśli jest przed południem,0
jeśli jest południe, lub1
jeśli jest po południu. - Sprawdź aktualną datę. Przy użyciu odpowiedniego operatora PHP napisz instrukcję, która wyświetla napis
"Minęła już połowa miesiąca"
, jeśli jest po 15. dniu miesiąca lub"Jeszcze nie minęła połowa miesiąca"
w przeciwnym przypadku. - Przy użyciu odpowiedniej stałej magicznej PHP sprawdź, jakiej wersji PHP używasz. Jeśli jej numer jest nie niższy niż 8, to wyświetl napis —
"Używam jednej z najnowszych wersji PHP"
, w przeciwnym przypadku wyświetl napis —"Pora na aktualizację"
. - Masz następującą tablicę:
$owady = array("turkuć" => "podjadek", "zyzuś" => "tłuścioch", "złodziejaszek" => "rypidełko");
Za pomocą operatora koalescencji
null
sprawdź, czy w tablicy tej znajduje się owad o pierwszym członie nazwy wydłubka.Jeśli tak, to zapisz drugi człon jego nazwy w zmiennej o dowolnej nazwie.
Jeśli nie, wyświetl na ekranie napis:
"brak"
. - Wykonaj poprzednie ćwiczenie dla wszystkich trzech istniejących elementów tej tablicy.
- Za pomocą odpowiedniego operator PHP i odpowiedniej funkcji PHP sprawdź, czy w tablicy z ćwiczenia 5. istnieją owady o pierwszych członach nazwy turkuć, zyzuś i złodziejaszek, a następnie wyświetl na ekranie ich pełne nazwy.
Podpowiedź: aby interpolować wartość elementu tablicy do łańcucha znaków, opuść cudzysłów na kluczu tego elementu.