Kurs PHP – operatory logiczne

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

  1. Logical Operators – oficjalna strona PHP z dokumentacją operatorów logicznych.
  2. Operator Precedence – oficjalna strona PHP z dokumentacją opisującą priorytet danego operatora.
Komentarze
  1. Damian

    Ćwiczenie z * (gwiazdką)! Jaki będzie wynik w tym kodzie:

    $a = true AND false;
    $b = true && false;
    var_dump($a, $b);

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.