1 added
1 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Кроме арифметических операций в математике есть операции сравнения, например, 5 > 4 или 1 < 3. Они есть и в программировании. Допустим, когда мы заходим на сайт, введенные логин и пароль сравниваются с теми, какие есть в базе. Если они есть, нас пускают внутрь - аутентифицируют. В этом уроке разберем операции сравнения.</p>
1
<p>Кроме арифметических операций в математике есть операции сравнения, например, 5 > 4 или 1 < 3. Они есть и в программировании. Допустим, когда мы заходим на сайт, введенные логин и пароль сравниваются с теми, какие есть в базе. Если они есть, нас пускают внутрь - аутентифицируют. В этом уроке разберем операции сравнения.</p>
2
<p>Языки программирования адаптировали все математические операции сравнения в неизменном виде, кроме операторов равенства и неравенства. В математике для этого используется обычное равно =, но в программировании такое встречается редко.</p>
2
<p>Языки программирования адаптировали все математические операции сравнения в неизменном виде, кроме операторов равенства и неравенства. В математике для этого используется обычное равно =, но в программировании такое встречается редко.</p>
3
<p>Во многих языках символ = используется, чтобы присвоить переменным значения. Поэтому в PHP сравнивают с помощью ==.</p>
3
<p>Во многих языках символ = используется, чтобы присвоить переменным значения. Поэтому в PHP сравнивают с помощью ==.</p>
4
<p>Список операций сравнения:</p>
4
<p>Список операций сравнения:</p>
5
<ul><li>< - меньше</li>
5
<ul><li>< - меньше</li>
6
<li><= - меньше или равно</li>
6
<li><= - меньше или равно</li>
7
<li>> - больше</li>
7
<li>> - больше</li>
8
<li>>= - больше или равно</li>
8
<li>>= - больше или равно</li>
9
<li>== - равно</li>
9
<li>== - равно</li>
10
<li>!= - не равно</li>
10
<li>!= - не равно</li>
11
</ul><p>Эти операции применяются не только к числам. Например, с помощью оператора равенства можно сравнить строки: password == text - это сравнение идентичности строк, которые записаны в разных переменных.</p>
11
</ul><p>Эти операции применяются не только к числам. Например, с помощью оператора равенства можно сравнить строки: password == text - это сравнение идентичности строк, которые записаны в разных переменных.</p>
12
<h2>Логический тип</h2>
12
<h2>Логический тип</h2>
13
<p>Логическая операция типа 5 > 4 или password == text - это выражение. Его результат - специальное значение True ("истина") или False ("ложь"). Это новый для нас тип данных - bool:</p>
13
<p>Логическая операция типа 5 > 4 или password == text - это выражение. Его результат - специальное значение True ("истина") или False ("ложь"). Это новый для нас тип данных - bool:</p>
14
<p>Он содержит всего лишь два этих значения. Наряду со строками (string) и целыми и рациональными числами, булев тип (bool) - это один из примитивных типов данных в PHP.</p>
14
<p>Он содержит всего лишь два этих значения. Наряду со строками (string) и целыми и рациональными числами, булев тип (bool) - это один из примитивных типов данных в PHP.</p>
15
<h2>Предикаты</h2>
15
<h2>Предикаты</h2>
16
<p>Попробуем написать простую функцию, которая принимает на вход возраст ребенка и определяет, младенец ли он. Младенцами считаются дети до года.</p>
16
<p>Попробуем написать простую функцию, которая принимает на вход возраст ребенка и определяет, младенец ли он. Младенцами считаются дети до года.</p>
17
<p>Любая операция - это выражение, поэтому единственной строчкой функции пишем "вернуть то значение, которое получится в результате сравнения age < 1". В зависимости от того, какой аргумент пришел, сравнение будет истинным (True) или ложным (False), а return вернет этот результат:</p>
17
<p>Любая операция - это выражение, поэтому единственной строчкой функции пишем "вернуть то значение, которое получится в результате сравнения age < 1". В зависимости от того, какой аргумент пришел, сравнение будет истинным (True) или ложным (False), а return вернет этот результат:</p>
18
<p>Подобные функции называют<strong>предикатами</strong>. Функции-предикаты отвечают на какой-то вопрос и всегда возвращают либо true, либо false.</p>
18
<p>Подобные функции называют<strong>предикатами</strong>. Функции-предикаты отвечают на какой-то вопрос и всегда возвращают либо true, либо false.</p>
19
<p>Предикаты во всех языках принято именовать особым образом для простоты анализа. В PHP предикаты, как правило, начинаются с префикса is, has или can, но не ограничены этими словами. Примеры:</p>
19
<p>Предикаты во всех языках принято именовать особым образом для простоты анализа. В PHP предикаты, как правило, начинаются с префикса is, has или can, но не ограничены этими словами. Примеры:</p>
20
<ul><li>isInfant() - "младенец ли?"</li>
20
<ul><li>isInfant() - "младенец ли?"</li>
21
<li>hasChildren() - "есть ли дети?"</li>
21
<li>hasChildren() - "есть ли дети?"</li>
22
<li>isEmpty() - "пустой ли?"</li>
22
<li>isEmpty() - "пустой ли?"</li>
23
<li>hasErrors() - "есть ли ошибки?"</li>
23
<li>hasErrors() - "есть ли ошибки?"</li>
24
</ul><h2>Комбинирование операций и функций</h2>
24
</ul><h2>Комбинирование операций и функций</h2>
25
<p><strong>Логические операции</strong>- это выражения, значит, их можно комбинировать с другими выражениями. Например, мы хотим проверить четность числа - кратность двум. В программировании используют такой подход: проверяют остаток от деления на два:</p>
25
<p><strong>Логические операции</strong>- это выражения, значит, их можно комбинировать с другими выражениями. Например, мы хотим проверить четность числа - кратность двум. В программировании используют такой подход: проверяют остаток от деления на два:</p>
26
<ul><li>если остаток 0 - число четное</li>
26
<ul><li>если остаток 0 - число четное</li>
27
<li>если остаток не 0 - число нечетное</li>
27
<li>если остаток не 0 - число нечетное</li>
28
</ul><p>Остаток от деления - простая, но важная концепция в арифметике, алгебре, в теории чисел и криптографии. Нужно разделить число на несколько равных групп, и если в конце что-то останется - это остаток от деления.</p>
28
</ul><p>Остаток от деления - простая, но важная концепция в арифметике, алгебре, в теории чисел и криптографии. Нужно разделить число на несколько равных групп, и если в конце что-то останется - это остаток от деления.</p>
29
<p>Делим конфеты поровну между людьми:</p>
29
<p>Делим конфеты поровну между людьми:</p>
30
<ul><li>7 конфет, 2 человека: 2 x 3 + остаток 1 - 7 не кратно 2</li>
30
<ul><li>7 конфет, 2 человека: 2 x 3 + остаток 1 - 7 не кратно 2</li>
31
<li>21 конфету, 3 человека: 3 x 7 + остаток 0 - 21 кратно 3</li>
31
<li>21 конфету, 3 человека: 3 x 7 + остаток 0 - 21 кратно 3</li>
32
<li>19 конфет, 5 человек: 5 x 3 + остаток 4 - 19 не кратно 5</li>
32
<li>19 конфет, 5 человек: 5 x 3 + остаток 4 - 19 не кратно 5</li>
33
</ul><p>Оператор % вычисляет<strong>остаток от деления</strong>:</p>
33
</ul><p>Оператор % вычисляет<strong>остаток от деления</strong>:</p>
34
<ul><li>7 % 2 → 1</li>
34
<ul><li>7 % 2 → 1</li>
35
<li>21 % 3 → 0</li>
35
<li>21 % 3 → 0</li>
36
<li>19 % 5 → 4</li>
36
<li>19 % 5 → 4</li>
37
</ul><p>С помощью него напишем функцию проверки четности:</p>
37
</ul><p>С помощью него напишем функцию проверки четности:</p>
38
<p>В одном выражении мы скомбинировали логический оператор проверки равенства === и арифметический оператор %. Оператор === работает почти так же, как ==. Чуть позже разберем, чем они отличаются.</p>
38
<p>В одном выражении мы скомбинировали логический оператор проверки равенства === и арифметический оператор %. Оператор === работает почти так же, как ==. Чуть позже разберем, чем они отличаются.</p>
39
<p>Приоритет арифметических операций выше логических. Значит, сначала вычисляется арифметическое выражение $number % 2, затем результат участвует в логическом сравнении.</p>
39
<p>Приоритет арифметических операций выше логических. Значит, сначала вычисляется арифметическое выражение $number % 2, затем результат участвует в логическом сравнении.</p>
40
<p>Это можно расшифровать так:</p>
40
<p>Это можно расшифровать так:</p>
41
<blockquote><p>"Вычислить остаток от деления числа $number на 2 и сравнить, равен ли остаток нулю; затем вернуть результат проверки равенства"*</p>
41
<blockquote><p>"Вычислить остаток от деления числа $number на 2 и сравнить, равен ли остаток нулю; затем вернуть результат проверки равенства"*</p>
42
</blockquote><h2>Логические операторы</h2>
42
</blockquote><h2>Логические операторы</h2>
43
<p>Логические выражения могут объединяться друг с другом, создавая все более хитрые проверки.</p>
43
<p>Логические выражения могут объединяться друг с другом, создавая все более хитрые проверки.</p>
44
<p>Хороший пример - проверка пароля. Как вы знаете, некоторые сайты при регистрации хотят пароль от 8 до 20 символов в длину.</p>
44
<p>Хороший пример - проверка пароля. Как вы знаете, некоторые сайты при регистрации хотят пароль от 8 до 20 символов в длину.</p>
45
<p>В математике мы бы написали 8 <= x <= 20, где x - это длина конкретного пароля. Но в PHP такой трюк не пройдет.</p>
45
<p>В математике мы бы написали 8 <= x <= 20, где x - это длина конкретного пароля. Но в PHP такой трюк не пройдет.</p>
46
<p>Нам придется сделать два отдельных логических выражения и соединить их специальным оператором "И":</p>
46
<p>Нам придется сделать два отдельных логических выражения и соединить их специальным оператором "И":</p>
47
<p>Оператор && означает "И" - в математической логике это называют<strong>конъюнкцией</strong>. Все выражение считается истинным только в том случае, когда истинен каждый операнд - каждое из составных выражений. Иными словами, && означает "и то, и другое". Приоритет этого оператора ниже, чем приоритет операторов сравнения, поэтому выражение отрабатывает правильно без скобок.</p>
47
<p>Оператор && означает "И" - в математической логике это называют<strong>конъюнкцией</strong>. Все выражение считается истинным только в том случае, когда истинен каждый операнд - каждое из составных выражений. Иными словами, && означает "и то, и другое". Приоритет этого оператора ниже, чем приоритет операторов сравнения, поэтому выражение отрабатывает правильно без скобок.</p>
48
<p>Кроме &&, часто используется оператор || - "ИЛИ" (<strong>дизъюнкция</strong>). Он означает "или то, или другое, или оба". Операторы можно комбинировать в любом количестве и любой последовательности, но когда одновременно встречаются && и ||, то приоритет лучше задавать скобками.</p>
48
<p>Кроме &&, часто используется оператор || - "ИЛИ" (<strong>дизъюнкция</strong>). Он означает "или то, или другое, или оба". Операторы можно комбинировать в любом количестве и любой последовательности, но когда одновременно встречаются && и ||, то приоритет лучше задавать скобками.</p>
49
<p>Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже увидите<strong>таблицы истинности</strong>- по ним можно определить, каким будет результат, если применить операторы:</p>
49
<p>Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже увидите<strong>таблицы истинности</strong>- по ним можно определить, каким будет результат, если применить операторы:</p>
50
<h3>И &&</h3>
50
<h3>И &&</h3>
51
<h3>ИЛИ ||</h3>
51
<h3>ИЛИ ||</h3>
52
<h2>Отрицание</h2>
52
<h2>Отрицание</h2>
53
<p>Наряду с конъюнкцией (И) и дизъюнкцией (ИЛИ), часто используется операция "отрицание". Отрицание меняет логическое значение на противоположное.</p>
53
<p>Наряду с конъюнкцией (И) и дизъюнкцией (ИЛИ), часто используется операция "отрицание". Отрицание меняет логическое значение на противоположное.</p>
54
-
<p>В программировании ему соответствует унарный оператор !. Если есть функция, проверя��щая четность числа, то с помощью отрицания можно выполнить проверку нечетности:</p>
54
+
<p>В программировании ему соответствует унарный оператор !. Если есть функция, проверяющая четность числа, то с помощью отрицания можно выполнить проверку нечетности:</p>
55
<p>Мы просто добавили ! слева от вызова функции и получили обратное действие. Отрицание - мощный инструмент, который позволяет лаконично выражать задуманные правила в коде без необходимости писать новые функции.</p>
55
<p>Мы просто добавили ! слева от вызова функции и получили обратное действие. Отрицание - мощный инструмент, который позволяет лаконично выражать задуманные правила в коде без необходимости писать новые функции.</p>
56
<h2>Слабая типизация</h2>
56
<h2>Слабая типизация</h2>
57
<p>Напомним, что PHP - это язык со<strong>слабой типизацией</strong>:</p>
57
<p>Напомним, что PHP - это язык со<strong>слабой типизацией</strong>:</p>
58
<ul><li>Он знает о существовании разных типов (числа, строки и так далее)</li>
58
<ul><li>Он знает о существовании разных типов (числа, строки и так далее)</li>
59
<li>При этом он относится к их использованию не очень строго, пытаясь преобразовывать информацию, когда это кажется разумным</li>
59
<li>При этом он относится к их использованию не очень строго, пытаясь преобразовывать информацию, когда это кажется разумным</li>
60
</ul><p>Особенно много автоматических преобразований происходит при работе с логическими операциями. В PHP есть два простых правила, по которым происходят преобразования:</p>
60
</ul><p>Особенно много автоматических преобразований происходит при работе с логическими операциями. В PHP есть два простых правила, по которым происходят преобразования:</p>
61
<ul><li>0, null и пустая строка '' приводятся к false, поэтому эти значения называют<em>falsy</em></li>
61
<ul><li>0, null и пустая строка '' приводятся к false, поэтому эти значения называют<em>falsy</em></li>
62
<li>Все остальное превращается в true</li>
62
<li>Все остальное превращается в true</li>
63
</ul><p>Это работает и в другую сторону. И true, и false преобразовываются в другие типы данных в зависимости от ситуации:</p>
63
</ul><p>Это работает и в другую сторону. И true, и false преобразовываются в другие типы данных в зависимости от ситуации:</p>
64
<p>Оператор<strong>ИЛИ</strong>работает только с типом<em>bool</em>, но ему даны числа 1 и 0:</p>
64
<p>Оператор<strong>ИЛИ</strong>работает только с типом<em>bool</em>, но ему даны числа 1 и 0:</p>
65
<ol><li>0 преобразуется в false, а 1 преобразуется в true</li>
65
<ol><li>0 преобразуется в false, а 1 преобразуется в true</li>
66
<li>Результат false || true - это true</li>
66
<li>Результат false || true - это true</li>
67
<li>Теперь print_r() получает true, но он работает только со строками</li>
67
<li>Теперь print_r() получает true, но он работает только со строками</li>
68
<li>true преобразуется в 1</li>
68
<li>true преобразуется в 1</li>
69
<li>И на экран выводится 1</li>
69
<li>И на экран выводится 1</li>
70
</ol><p>Здесь важно отметить также отличие операторов == и ===. Оно как раз заключается в преобразовании типов.</p>
70
</ol><p>Здесь важно отметить также отличие операторов == и ===. Оно как раз заключается в преобразовании типов.</p>
71
<p>Пустая строка и false - это разные значения, поэтому оператор === говорит "Ложь! Они не равны!".</p>
71
<p>Пустая строка и false - это разные значения, поэтому оператор === говорит "Ложь! Они не равны!".</p>
72
<p>Но оператор == преобразует типы. С его точки зрения, пустая строка и false равны. Это преобразование неявное, поэтому по возможности избегайте операторов == и !=:</p>
72
<p>Но оператор == преобразует типы. С его точки зрения, пустая строка и false равны. Это преобразование неявное, поэтому по возможности избегайте операторов == и !=:</p>
73
<p>Вспомним операцию отрицания. При двойном отрицании !! итоговое значение равно начальному:</p>
73
<p>Вспомним операцию отрицания. При двойном отрицании !! итоговое значение равно начальному:</p>
74
<p>Здесь также дополнительно происходят преобразования типа. Поэтому результатом двойного отрицания всегда будет<em>bool</em>. Этим приемом пользуются, чтобы поменять тип данных.</p>
74
<p>Здесь также дополнительно происходят преобразования типа. Поэтому результатом двойного отрицания всегда будет<em>bool</em>. Этим приемом пользуются, чтобы поменять тип данных.</p>
75
<p>В разных языках программирования разные правила преобразований. Некоторые языки вообще не преобразовывают типы сами.</p>
75
<p>В разных языках программирования разные правила преобразований. Некоторые языки вообще не преобразовывают типы сами.</p>