Логические операторы в PHP

Александр Кичатов

Логические операторы позволяют указывать сразу несколько условий для одного блока IF:

<?php
    $price = 5;

    if($price >= 5 && $price <= 10)
        echo 'Это число находится между 5 и 10';

Оператор &&, который ещё называется логическое И, приводит значения слева и справа к булеву типу, а затем и сам возвращает булево значение: true если слева и справа true, либо false если одно из условий false.

Другими словами, если и одно, и другое условие истинно, то и оператор && возвращает истину. Что и отражает название оператора.

Оператор || или логическое ИЛИ возвращает истину когда истинно хотя бы одно из двух условий:

<?php
    if(10 > 5 || 1 > 2)
        echo 'Условие выполнено.';
?>

В коде выше команда echo будет выполнена, поскольку одно из условий истинно.

Все логические операторы в PHP

$a && $b
Истина, если $a и $b равны true.
$a || $bИстина, если хотя бы одна из $a и $b равна true.
$a xor $bИстина, если одна из $a и $b равна true, но не обе.
!$aИстина, если $a не равна true.
$a and $bАналогично &&
$a or $bАналогично ||

Между операторами && и and, а также между || и or есть небольшое различие - порядок выполнения.

Как вы знаете, умножение имеет больший приоритет, чем сложение. Так вот, операторы and и or имеют приоритет ниже, чем оператор присваивания =. Результат можно увидеть в следующем примере:

<?php
	$var = true && false;
	var_dump($var); // Выведет false

	$var = true and false;
	var_dump($var); // Выведет... true!

Поскольку у = приоритет выше, PHP воспримет код так:

($var = true) and false;

Т.е. сначала он присваивает переменной $var значение true, а затем происходит операция true and false, которая не имеет смысла, поскольку не влияет на значение переменной.

Ниже расположена таблица с приоритетами операторов. С некоторыми из них вы уже встречались. Чем выше оператор в таблице - тем выше его приоритет.

  • ++ -- ~ (int) (float) (string) (array) (object) (bool) @
  • * / %
  • + - .
  • < <= > >=
  • == != === !== <> <=>
  • &&
  • ||
  • ? : (тернарный оператор)
  • = += -= *= **= /= .= %= &= |= ^= <<= >>=
  • and
  • xor
  • or

Теперь мы можем определить, что приоритет операторов сравнения (==, != и т.д.) выше, чем у логических операторов. Эта информация пригодится нам для выполнения задачи.

Задача

Каким будет результат выполнения следующего выражения?

<?php
    $a = 100;
    $result = $a >= 5 && $a < 10 || $a == 100;

<?php
    $a = 100;
    $result = $a >= 5 && $a < 10 || $a == 100;

    // 1. Сначала подставляем значения
    $result = 100 >= 5 && 100 < 10 || 100 == 100;

    // 2. Затем выполняем операторы сравнения, получаем:
    $result = true && false || true;

    // 3. true && false возвращает false.
    $result = false || true;

    // 4. false || true возвращает true

Комментарии