PHP: Отрицание

Наряду с логическими операторами И и ИЛИ, часто используется операция «отрицание». Она меняет логическое значение на противоположное. В PHP отрицанию соответствует унарный оператор !:

<?php

!true;  // false
!false; // true

Например, если есть функция, которая проверяет четность числа, то с помощью отрицания можно выполнить проверку нечетности:

<?php

function isEven(int $number): bool
{
    return $number % 2 === 0;
}

var_dump(isEven(10));  // => bool(true)
var_dump(!isEven(10)); // => bool(false)

В примере выше мы добавили ! слева от вызова функции и получили обратное действие.

Отрицание позволяет выражать задуманные правила в коде без написания новых функций. Если написать !!isEven(10), то код сработает даже в таком случае:

<?php

var_dump(!!isEven(10)); // => bool(true)

В логике двойное отрицание равносильно отсутствию отрицания:

<?php

!!true;  // true
!!false; // false

var_dump(!!isEven(10)); // => bool(true)
var_dump(!!isEven(11)); // => bool(false)

! можно комбинировать с && и ||. Среди логических операторов у него наивысший приоритет, поэтому он применяется первым:

<?php

!true || true;  // (!true) || true   => false || true  => true
!true && false; // (!true) && false  => false && false => false

Скобки меняют порядок вычисления:

<?php

!(true || true);  // !true  => false
!(true && false); // !false => true

Практический пример — функция проверяет, может ли водитель сесть за руль: нужны права и трезвость:

<?php

function canDrive(bool $hasLicense, bool $isDrunk): bool
{
    return $hasLicense && !$isDrunk;
}

var_dump(canDrive(true, false));  // => bool(true)  (есть права, трезвый)
var_dump(canDrive(true, true));   // => bool(false) (есть права, но пьяный)
var_dump(canDrive(false, false)); // => bool(false) (нет прав)

Теперь вы знаете, что означают операторы И, ИЛИ и !. С их помощью вы сможете задавать составные условия из двух и более логических выражений.

Законы де Моргана

При работе со сложными логическими выражениями бывает нужно их инвертировать или переписать в эквивалентную форму, которую легче читать. Для этого существуют законы де Моргана — два правила, которые описывают, как отрицание распределяется по составному выражению:

!(A && B)  эквивалентно  !A || !B
!(A || B)  эквивалентно  !A && !B

Первый закон: отрицание конъюнкции равно дизъюнкции отрицаний. Проверим:

<?php

!(true && false); // !false => true
!true || !false;  // false || true => true

Второй закон: отрицание дизъюнкции равно конъюнкции отрицаний:

<?php

!(true || false); // !true => false
!true && !false;  // false && true => false

На практике законы де Моргана помогают упрощать условия. Например, вместо !($isAdmin || $isModerator) можно написать !$isAdmin && !$isModerator — читается как «не администратор и не модератор».

Задание

В игре со словами участники проверяют, является ли слово палиндромом. Реализуйте две функции isPalindrome() и isNotPalindrome(), принимающие строку на вход

  1. Функция isPalindrome() определяет, является ли слово палиндромом или нет. Палиндром — это слово, которое читается одинаково в обоих направлениях.

    <?php
    
    isPalindrome('wow'); // true
    isPalindrome('mom'); // true
    isPalindrome('hexlet'); // false
    
    // Слова в функцию могут быть переданы в любом регистре
    // Поэтому сначала нужно привести слово в нижний регистр strtolower()
    isPalindrome('Wow'); // true

    Для того чтобы развернуть слово задом наперёд используйте функцию strrev().

  2. Функция isNotPalindrome() проверяет что слово НЕ является палиндромом:

    <?php
    
    isNotPalindrome('wow'); // false
    isNotPalindrome('mom'); // false
    isNotPalindrome('hexlet'); // true

    Для этого, вызовите функцию isPalindrome() внутри isNotPalindrome() и примените отрицание.

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются