PHP: Логический тип
Кроме арифметических операций в математике есть операции сравнения, например, 5 > 4 или 3 < 1. Они есть и в программировании. Сравнения часто применяются в реальных задачах, связанных с числами. Например, когда мы оформляем покупку в интернет-магазине, система проверяет: хватает ли у пользователя денег на счете, чтобы оплатить товар. Если сумма на счете больше или равна цене товара, заказ подтверждается. При нехватке средств появляется соответствующее сообщение.
Сравнение в программировании
Начнем с примера, в котором сравнивается два числа:
<?php
var_dump(5 > 4); // => bool(true)
var_dump(4 > 4); // => bool(false)Результатом сравнения является значение типа bool. У этого типа есть всего два возможных варианта true и false. Это специальные значения языка. Их можно использовать напрямую:
<?php
var_dump(true); // => bool(true)
var_dump(false); // => bool(false)Обратите внимание на новую функцию var_dump(). Привычная нам print_r() плохо подходит для вывода логических значений: true она печатает как 1, а false — как пустую строку. Функция var_dump() выводит и тип, и значение, поэтому для значений типа bool используют ее.
На практике значения true и false редко используют напрямую, но на их основе строится логика поведения программы. Мы с этим сталкиваемся буквально каждый день, когда вводим пинкоды и пароли, когда выполняем какие-то действия, результатом которых могут быть разные варианты. Все эти варианты прописаны внутри программы в виде условных выражений. Программа рассуждает примерно так: если так-то делай раз, если по-другому, то делай два.
В PHP доступны следующие операции сравнения:
<и<=обозначают «меньше» и «меньше или равно»>и>=обозначают «больше» и «больше или равно»==и!=обозначают «равно» и «не равно»===и!==обозначают «строго равно» и «строго не равно»
Языки программирования адаптировали все математические операции сравнения в неизменном виде, кроме операторов равенства и неравенства. В математике для этого используется обычное равно =, но в программировании символ =, чаще всего, используется, чтобы присвоить переменным значения. Поэтому в PHP сравнивают с помощью == и ===.
Чем различаются эти два оператора? Вспомните урок про слабую типизацию: PHP пытается автоматически преобразовывать типы. Оператор == сравнивает значения после такого преобразования, поэтому, например, 0 == '0' оказывается истиной. Оператор === сравнивает строго, без преобразования: значения равны, только если совпадают и тип, и само значение. Неявные преобразования приводят к трудноуловимым ошибкам, поэтому в PHP принято использовать строгие операторы === и !== — так мы и будем делать в этом курсе.
Несколько примеров:
<?php
var_dump(5 >= 3); // => bool(true)
var_dump(7 < 0); // => bool(false)
var_dump(5 > 5); // => bool(false)
var_dump(5 >= 5); // => bool(true)
var_dump(2 === 5); // => bool(false)
var_dump(2 !== 5); // => bool(true)Когда в сравнении используют конкретные значения, то эта операция кажется бессмысленной, мы и так знаем ее результат сравнения и он всегда один и тот же, потому что если 3 больше 2, то это не меняется. Но все меняется, когда значения могут меняться. Попробуем написать простую функцию, которая принимает на вход возраст ребенка и определяет, младенец ли он. Младенцами считаются дети до двух лет (два не включается).
<?php
function isInfant(int $age): bool
{
return $age < 2;
}
var_dump(isInfant(3)); // => bool(false)
var_dump(isInfant(2)); // => bool(false)
var_dump(isInfant(1)); // => bool(true)
var_dump(isInfant(0)); // => bool(true)Когда функции возвращают результат сравнения, они обычно отвечают на вопрос «да» или «нет». Такие функции называют предикатами. Их легко узнать по тому, что они возвращают логическое значение true или false. Часто в их названии есть вопрос или утверждение, которое можно проверить. В PHP предикаты, как правило, начинаются с префикса is, has или can, но не ограничены этими словами. Примеры:
isInfant()— «младенец ли?»hasChildren()— «есть ли дети?»isEmpty()— «пустой ли?»hasErrors()— «есть ли ошибки?»
Вот функция, проверяющая, является ли число отрицательным:
<?php
// Проверяем, меньше ли число нуля
function isNegative(int $number): bool
{
return $number < 0;
}
var_dump(isNegative(-5)); // => bool(true)
var_dump(isNegative(7)); // => bool(false)Задание
Напишите функцию isPensioner(), которая принимает возраст в качестве единственного аргумента и проверяет, является ли этот возраст пенсионным. Пенсионным считается возраст 60 лет и больше.
Примеры вызова:
<?php
isPensioner(75); // true
isPensioner(18); // falseПолезное
PHP: Логический тип
Кроме арифметических операций в математике есть операции сравнения, например, 5 > 4 или 3 < 1. Они есть и в программировании. Сравнения часто применяются в реальных задачах, связанных с числами. Например, когда мы оформляем покупку в интернет-магазине, система проверяет: хватает ли у пользователя денег на счете, чтобы оплатить товар. Если сумма на счете больше или равна цене товара, заказ подтверждается. При нехватке средств появляется соответствующее сообщение.
Сравнение в программировании
Начнем с примера, в котором сравнивается два числа:
<?php
var_dump(5 > 4); // => bool(true)
var_dump(4 > 4); // => bool(false)Результатом сравнения является значение типа bool. У этого типа есть всего два возможных варианта true и false. Это специальные значения языка. Их можно использовать напрямую:
<?php
var_dump(true); // => bool(true)
var_dump(false); // => bool(false)Обратите внимание на новую функцию var_dump(). Привычная нам print_r() плохо подходит для вывода логических значений: true она печатает как 1, а false — как пустую строку. Функция var_dump() выводит и тип, и значение, поэтому для значений типа bool используют ее.
На практике значения true и false редко используют напрямую, но на их основе строится логика поведения программы. Мы с этим сталкиваемся буквально каждый день, когда вводим пинкоды и пароли, когда выполняем какие-то действия, результатом которых могут быть разные варианты. Все эти варианты прописаны внутри программы в виде условных выражений. Программа рассуждает примерно так: если так-то делай раз, если по-другому, то делай два.
В PHP доступны следующие операции сравнения:
<и<=обозначают «меньше» и «меньше или равно»>и>=обозначают «больше» и «больше или равно»==и!=обозначают «равно» и «не равно»===и!==обозначают «строго равно» и «строго не равно»
Языки программирования адаптировали все математические операции сравнения в неизменном виде, кроме операторов равенства и неравенства. В математике для этого используется обычное равно =, но в программировании символ =, чаще всего, используется, чтобы присвоить переменным значения. Поэтому в PHP сравнивают с помощью == и ===.
Чем различаются эти два оператора? Вспомните урок про слабую типизацию: PHP пытается автоматически преобразовывать типы. Оператор == сравнивает значения после такого преобразования, поэтому, например, 0 == '0' оказывается истиной. Оператор === сравнивает строго, без преобразования: значения равны, только если совпадают и тип, и само значение. Неявные преобразования приводят к трудноуловимым ошибкам, поэтому в PHP принято использовать строгие операторы === и !== — так мы и будем делать в этом курсе.
Несколько примеров:
<?php
var_dump(5 >= 3); // => bool(true)
var_dump(7 < 0); // => bool(false)
var_dump(5 > 5); // => bool(false)
var_dump(5 >= 5); // => bool(true)
var_dump(2 === 5); // => bool(false)
var_dump(2 !== 5); // => bool(true)Когда в сравнении используют конкретные значения, то эта операция кажется бессмысленной, мы и так знаем ее результат сравнения и он всегда один и тот же, потому что если 3 больше 2, то это не меняется. Но все меняется, когда значения могут меняться. Попробуем написать простую функцию, которая принимает на вход возраст ребенка и определяет, младенец ли он. Младенцами считаются дети до двух лет (два не включается).
<?php
function isInfant(int $age): bool
{
return $age < 2;
}
var_dump(isInfant(3)); // => bool(false)
var_dump(isInfant(2)); // => bool(false)
var_dump(isInfant(1)); // => bool(true)
var_dump(isInfant(0)); // => bool(true)Когда функции возвращают результат сравнения, они обычно отвечают на вопрос «да» или «нет». Такие функции называют предикатами. Их легко узнать по тому, что они возвращают логическое значение true или false. Часто в их названии есть вопрос или утверждение, которое можно проверить. В PHP предикаты, как правило, начинаются с префикса is, has или can, но не ограничены этими словами. Примеры:
isInfant()— «младенец ли?»hasChildren()— «есть ли дети?»isEmpty()— «пустой ли?»hasErrors()— «есть ли ошибки?»
Вот функция, проверяющая, является ли число отрицательным:
<?php
// Проверяем, меньше ли число нуля
function isNegative(int $number): bool
{
return $number < 0;
}
var_dump(isNegative(-5)); // => bool(true)
var_dump(isNegative(7)); // => bool(false)Задание
Напишите функцию isPensioner(), которая принимает возраст в качестве единственного аргумента и проверяет, является ли этот возраст пенсионным. Пенсионным считается возраст 60 лет и больше.
Примеры вызова:
<?php
isPensioner(75); // true
isPensioner(18); // falseПолезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Logic\BoolType;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertFalse(isPensioner(23));
$this->assertFalse(isPensioner(59));
$this->assertTrue(isPensioner(60));
$this->assertTrue(isPensioner(70));
}
}Решение учителя откроется через:
20:00
