29-03-2023
W tym rozdziale omówimy sobie 6 operatorów logicznych: &&, ||, OR, AND, !, XOR.
&&
&& jest operatorem tłumaczonym na polski „i”. Ale może przejdźmy do przykładu 👇
<?php $a = true; $b = true; var_dump($a && $b); // true $a = false; $b = true; var_dump($a && $b); // false $a = true; $b = false; var_dump($a && $b); // false
Jeżeli $a i $b są prawdą (true) to zostanie zwrócona prawda. Ogólnie to „prawdą” nie jest tylko wartość true, ale w takich przypadkach będzie to również liczba (inna niż 0), tekst (inny niż pusty ciąg i 0). Spójrz na poniższe przykłady⬇ W komentarzu napisałam, jakie zostaną zwrócone wyniki.
<?php var_dump(7 && true); // true var_dump(7 && 9); // true var_dump("TEST" && true); // true var_dump("1" && true); // true var_dump(-1 && true); // true var_dump(null && true); // false var_dump(0 && true); // false var_dump("0" && true); // false var_dump("" && true); // false var_dump(8 && false); // false
||
Operator który możemy tłumaczyć na lub. Jeśli jedna LUB druga wartość jest prawdą to zostanie zwrócona prawda 👇 Tak więc dla wszyskich przypadków z powyższego kodu, gdy zamienimy operator na || to zostanie zwrócone true. Poniżej również przypadki dla których zostanie zwrócony fałsz.
<?php var_dump(null || true); // true var_dump(0 || true); // true var_dump("0" || true); // true var_dump("" || true); // true var_dump(false || true); // true var_dump(null || false); // false var_dump(0 || false); // false var_dump("0" || false); // false var_dump("" || false); // false var_dump(false || false); // false
!
Wykrzyknik jest negacją. Jeśli wartość jest prawdą to negacja zamienia ją w fałsz.
<?php var_dump(!null); // true var_dump(!0); // true var_dump(!false); // true var_dump(!true); // false var_dump(!10); // false var_dump(!"PRAWDA"); // false
AND
Słowo AND działa podobnie do && – jest logicznym i.
<?php var_dump(7 and true); // true var_dump(7 and 9); // true var_dump("TEST" and true); // true var_dump("1" and true); // true var_dump(-1 and true); // true var_dump(null and true); // false var_dump(0 and true); // false var_dump("0" and true); // false var_dump("" and true); // false var_dump(8 and false); // false
OR
Słowo OR działa podobnie do || – jest logicznym lub.
<?php var_dump(null or true); // true var_dump(0 or true); // true var_dump("0" or true); // true var_dump("" or true); // true var_dump(false or true); // true var_dump(null or false); // false var_dump(0 or false); // false var_dump("0" or false); // false var_dump("" or false); // false var_dump(false or false); // false
XOR
Jest to operator, który zwraca TRUE tylko, gdy jedna wartość ma TRUE. W przypadku, kiedy obie wartości są TRUE, XOR zwróci FALSE.
<?php var_dump(null xor true); // true var_dump(0 xor true); // true var_dump("0" xor true); // true var_dump("" xor true); // true var_dump(false xor true); // true var_dump(null xor false); // false var_dump(0 xor false); // false var_dump("0" xor false); // false var_dump("" xor false); // false var_dump(false xor false); // false var_dump(true xor true); // false var_dump(7 xor 9); // false var_dump("TEST" xor true); // false var_dump("1" xor true); // false var_dump(-1 xor true); // false
Łączenie operatorów
Operatory możemy ze sobą łączyć. Warto jednak pamiętać, że nie dając nawiasów może się okazać, że pewien operator zostanie użyty szybciej niż drugi 😉 Jak możesz zobaczyć na poniższym przykładzie AND zostanie wykonane jako pierwsze, a dopiero potem OR, co powoduje, że pierwszy var_dump zwraca TRUE. Dopiero, gdy zamkniemy w nawias OR – aby zostało wykonane jako pierwsze to dostajemy wynik FALSE.
<?php var_dump(true or true and false); // true var_dump((true or true) and false); // false
Różnice pomiędzy && i AND, oraz OR i ||
Pewnie się zastanawiasz dlaczego są aż dwa „LUB” oraz „I”. Otóż mają one trochę inny priorytet wykonania, przez co w pewnych sytuacjach dają zupełnie inne wyniki.
Operator && ma wyższy priorytet niż ||. Co już można było zobaczyć w poprzedniej sekcji. || ma większy priorytet niż operator przypisana (=). Operator przypisania ma większy priorytet niż AND. A AND ma większy priorytet niż OR.
&& > || > = > AND > OR
Co to w praktyce oznacza? Spójrz na poniższe przykłady.
<?php var_dump(true or true and false); // true var_dump(true || true and false); // false
W pierwszym przykładzie AND ma większy priorytet niż OR, więc wykona się jako pierwszy. Natomiast w drugiej linii || ma większy priorytet niż AND więc || wykona się jako pierwsze. Niby OR i || oznaczają LUB, ale jednak przez to, że mają inny priorytet to mogą zaskoczyć.
RADA 1: nie używaj zamiennie || i OR. Jak już to używaj tylko par
&& i ||
lub
AND i OR.
Poniżej inny przykład. Tym razem przypisanie wartości logicznej do zmiennej. I tu kolejna niespodzianka, pierwsze zwróci TRUE, a drugie FALSE.
Dlaczego? Bo operator przypisania (znak równa się) ma większy priorytet niż OR czy AND. Więc najpierw nastąpi przypisanie FALSE do zmiennej $b, a dopiero potem ” or true”.
<?php $a = false || true; var_dump($a); // true $b = false or true; var_dump($b); // false
RADA 2: Ja osobiście polecam używanie && i ||, bo nie ma takich niespodzianek jak przy OR i AND. Ogólnie && i || zdecydowanie dominują jako operatory logiczne w świecie PHP. Jednakże warto znać OR i AND, bo też trafiają się w projektach, ale przy tym warto wiedzieć jakie niosą za sobą konsekwencje!
Pełną listę priorytetów operatorów załączyłam w sekcji „Dodatkowe informacje”.
Ćwiczenie
Spójrz na poniższy kod i zastanów się jakie wartości zostaną zwrócone (TRUE czy FALSE). Następnie wykonaj kod w Sandbox PHP i sprawdź swoje odpowiedzi.
<?php var_dump($a = false and false); var_dump($b = false or true); $c = false or true; var_dump($c); var_dump(false and true or true && true); var_dump(false and true || true && true); $a = true; $b = false; $c = true; var_dump($a xor $b and $c); var_dump($a xor $b || $c); var_dump($a xor $b or $c);
Dodatkowe informacje
- Logical Operators – oficjalna strona PHP z dokumentacją operatorów logicznych.
- Operator Precedence – oficjalna strona PHP z dokumentacją opisującą priorytet danego operatora.
Ćwiczenie z * (gwiazdką)! Jaki będzie wynik w tym kodzie:
$a = true AND false;
$b = true && false;
var_dump($a, $b);