Operatory porównania i logiczne
🎯 Po tej lekcji porównasz wartości i połączysz warunki logiczne, unikając typowych pułapek operatora ==.
Porównywanie wartości i łączenie warunków to codzienność w programowaniu. „Czy użytkownik jest zalogowany?", „Czy wiek wynosi co najmniej 18 lat?", „Czy koszyk nie jest pusty?" — to wszystko wymaga operatorów.
Operatory porównania
PHP ma kilka operatorów porównania. Oto najważniejsze:
<?php
declare(strict_types=1);
$a = 10;
$b = 20;
var_dump($a == $b); // false — czy wartości są równe?
var_dump($a != $b); // true — czy wartości są różne?
var_dump($a < $b); // true — mniejszy niż
var_dump($a > $b); // false — większy niż
var_dump($a <= $b); // true — mniejszy lub równy
var_dump($a >= $b); // false — większy lub równy
=== vs == — ścisłe i luźne porównanie
To jedna z najważniejszych różnic w PHP. Zawsze preferuj ===:
<?php
declare(strict_types=1);
// === sprawdza wartość I typ
var_dump(1 === 1); // bool(true) — int vs int, ta sama wartość
var_dump(1 === '1'); // bool(false) — int vs string — różne typy!
var_dump(true === 1); // bool(false) — bool vs int
// == sprawdza tylko wartość (po konwersji typów)
var_dump(1 == '1'); // bool(true) — PHP zamienia '1' na 1
var_dump(true == 1); // bool(true) — PHP zamienia true na 1
== konwertuje typy przed porównaniem, co daje zaskakujące wyniki:
Używaj === domyślnie. Po == sięgaj tylko gdy świadomie chcesz porównania luźnego — i wiedz, co robisz.
Operatory logiczne: && || !
Służą do łączenia warunków:
<?php
declare(strict_types=1);
$wiek = 22;
$maKonto = true;
$zalogowany = false;
// && (AND) — oba warunki muszą być true
var_dump($wiek >= 18 && $maKonto); // bool(true)
var_dump($wiek >= 18 && $zalogowany); // bool(false) — $zalogowany to false
// || (OR) — wystarczy jeden warunek true
var_dump($maKonto || $zalogowany); // bool(true) — $maKonto jest true
var_dump($wiek < 18 || $zalogowany); // bool(false) — oba false
// ! (NOT) — odwraca wartość logiczną
var_dump(!$zalogowany); // bool(true) — odwraca false na true
var_dump(!$maKonto); // bool(false) — odwraca true na false
Operatory logiczne możesz też pisać słownie: and, or, not — ale uwaga, mają niższy priorytet niż && i ||. Bezpieczniej trzymać się &&, ||, !.
Operator ?? — null coalescing
Operator ?? rozwiązuje jeden z najczęstszych problemów: „co zrobić, gdy wartość to null?".
<?php
declare(strict_types=1);
$nazwaUzytkownika = null;
// Bez ?? — trzeba sprawdzać ręcznie
$wyswietlNazwe = ($nazwaUzytkownika !== null) ? $nazwaUzytkownika : 'Gość';
// Z ?? — krótko i czytelnie
$wyswietlNazwe = $nazwaUzytkownika ?? 'Gość';
echo $wyswietlNazwe; // wynik: Gość
?? zwraca lewą stronę, jeśli nie jest null. Jeśli jest null, zwraca prawą stronę. Świetnie sprawdza się przy danych z formularzy lub parametrach URL:
<?php
declare(strict_types=1);
// Symulacja danych z URL: np. ?strona=2
$strona = $_GET['strona'] ?? 1; // jeśli brak parametru — domyślnie strona 1
$kategoria = $_GET['kategoria'] ?? 'wszystkie'; // domyślna kategoria
echo "Strona: $strona, kategoria: $kategoria";
Operator ternary — skrócony if
Przy okazji warto poznać operator trójkowy ? :, który pozwala wybrać między dwiema wartościami:
<?php
declare(strict_types=1);
$wiek = 17;
$status = ($wiek >= 18) ? 'pełnoletni' : 'niepełnoletni';
echo $status; // wynik: niepełnoletni
// Równoważne if/else:
// if ($wiek >= 18) {
// $status = 'pełnoletni';
// } else {
// $status = 'niepełnoletni';
// }
Łączenie operatorów
<?php
declare(strict_types=1);
$wiek = 20;
$maZnizkę = true;
$kodRabatowy = null;
// Złożony warunek z &&
$maRabat = ($wiek < 26 && $maZnizkę === true);
var_dump($maRabat); // bool(true)
// ?? i &&
$uzytyKod = $kodRabatowy ?? 'brak';
echo "Kod rabatowy: $uzytyKod"; // wynik: Kod rabatowy: brak
Sprawdź się
Co sprawdza operator ===?
=== to porównanie ścisłe: zwraca true tylko gdy wartość ORAZ typ są identyczne. 1 === '1' zwróci false, bo int ≠ string.
Co zwróci wyrażenie: 0 == false?
Operator == konwertuje typy przed porównaniem. W PHP 0 == false daje true, bo 0 jest uznawany za wartość falsy.
Co zwróci: $x = null; echo $x ?? 'domyślna';
Operator ?? (null coalescing) zwraca lewą stronę, jeśli nie jest null. Gdy $x jest null, zwraca prawą stronę: 'domyślna'.
Które wyrażenie logiczne zwraca true, gdy $a = true i $b = false?
|| (OR) zwraca true, gdy choć jeden z operandów jest true. $a || $b = true || false = true.
Ćwiczenie
Masz zmienne: $wiek = 20 i $posiadaKonto = true. Sprawdź warunkiem (&&), czy użytkownik ma co najmniej 18 lat i posiada konto. Wynik przypisz do $mozePlaciOnline. Wyświetl, czy może płacić online. Użyj === do porównań.
Pokaż rozwiązanie
<?php
declare(strict_types=1);
$wiek = 20;
$posiadaKonto = true;
$mozePlaciOnline = ($wiek >= 18) && ($posiadaKonto === true);
if ($mozePlaciOnline) {
echo 'Użytkownik może płacić online.';
} else {
echo 'Płatność online niedostępna.';
}
// wynik: Użytkownik może płacić online.