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
⚠️ Pułapka operatora ==: Operator == 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 ===?

Co zwróci wyrażenie: 0 == false?

Co zwróci: $x = null; echo $x ?? 'domyślna';

Które wyrażenie logiczne zwraca true, gdy $a = true i $b = false?

Ć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.