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(), принимающие строку на вход
-
Функция
isPalindrome()определяет, является ли слово палиндромом или нет. Палиндром — это слово, которое читается одинаково в обоих направлениях.<?php isPalindrome('wow'); // true isPalindrome('mom'); // true isPalindrome('hexlet'); // false // Слова в функцию могут быть переданы в любом регистре // Поэтому сначала нужно привести слово в нижний регистр strtolower() isPalindrome('Wow'); // trueДля того чтобы развернуть слово задом наперёд используйте функцию
strrev(). -
Функция
isNotPalindrome()проверяет что слово НЕ является палиндромом:<?php isNotPalindrome('wow'); // false isNotPalindrome('mom'); // false isNotPalindrome('hexlet'); // trueДля этого, вызовите функцию
isPalindrome()внутриisNotPalindrome()и примените отрицание.
Полезное
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(), принимающие строку на вход
-
Функция
isPalindrome()определяет, является ли слово палиндромом или нет. Палиндром — это слово, которое читается одинаково в обоих направлениях.<?php isPalindrome('wow'); // true isPalindrome('mom'); // true isPalindrome('hexlet'); // false // Слова в функцию могут быть переданы в любом регистре // Поэтому сначала нужно привести слово в нижний регистр strtolower() isPalindrome('Wow'); // trueДля того чтобы развернуть слово задом наперёд используйте функцию
strrev(). -
Функция
isNotPalindrome()проверяет что слово НЕ является палиндромом:<?php isNotPalindrome('wow'); // false isNotPalindrome('mom'); // false isNotPalindrome('hexlet'); // trueДля этого, вызовите функцию
isPalindrome()внутриisNotPalindrome()и примените отрицание.
Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Logic\LogicalNegation;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertFalse(isNotPalindrome('wow'));
$this->assertFalse(isNotPalindrome('asdffdsa'));
$this->assertFalse(isNotPalindrome('Wow'));
$this->assertTrue(isNotPalindrome('hexlet'));
}
}Решение учителя откроется через:
20:00
