HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Кроме арифметических операций в математике есть операции сравнения, например, 5 &gt; 4 или 1 &lt; 3. Они есть и в программировании. Допустим, когда мы заходим на сайт, введенные логин и пароль сравниваются с теми, какие есть в базе. Если они есть, нас пускают внутрь - аутентифицируют. В этом уроке разберем операции сравнения.</p>
1 <p>Кроме арифметических операций в математике есть операции сравнения, например, 5 &gt; 4 или 1 &lt; 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>&lt; - меньше</li>
5 <ul><li>&lt; - меньше</li>
6 <li>&lt;= - меньше или равно</li>
6 <li>&lt;= - меньше или равно</li>
7 <li>&gt; - больше</li>
7 <li>&gt; - больше</li>
8 <li>&gt;= - больше или равно</li>
8 <li>&gt;= - больше или равно</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 &gt; 4 или password == text - это выражение. Его результат - специальное значение True ("истина") или False ("ложь"). Это новый для нас тип данных - bool:</p>
13 <p>Логическая операция типа 5 &gt; 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 &lt; 1". В зависимости от того, какой аргумент пришел, сравнение будет истинным (True) или ложным (False), а return вернет этот результат:</p>
17 <p>Любая операция - это выражение, поэтому единственной строчкой функции пишем "вернуть то значение, которое получится в результате сравнения age &lt; 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 &lt;= x &lt;= 20, где x - это длина конкретного пароля. Но в PHP такой трюк не пройдет.</p>
45 <p>В математике мы бы написали 8 &lt;= x &lt;= 20, где x - это длина конкретного пароля. Но в PHP такой трюк не пройдет.</p>
46 <p>Нам придется сделать два отдельных логических выражения и соединить их специальным оператором "И":</p>
46 <p>Нам придется сделать два отдельных логических выражения и соединить их специальным оператором "И":</p>
47 <p>Оператор &amp;&amp; означает "И" - в математической логике это называют<strong>конъюнкцией</strong>. Все выражение считается истинным только в том случае, когда истинен каждый операнд - каждое из составных выражений. Иными словами, &amp;&amp; означает "и то, и другое". Приоритет этого оператора ниже, чем приоритет операторов сравнения, поэтому выражение отрабатывает правильно без скобок.</p>
47 <p>Оператор &amp;&amp; означает "И" - в математической логике это называют<strong>конъюнкцией</strong>. Все выражение считается истинным только в том случае, когда истинен каждый операнд - каждое из составных выражений. Иными словами, &amp;&amp; означает "и то, и другое". Приоритет этого оператора ниже, чем приоритет операторов сравнения, поэтому выражение отрабатывает правильно без скобок.</p>
48 <p>Кроме &amp;&amp;, часто используется оператор || - "ИЛИ" (<strong>дизъюнкция</strong>). Он означает "или то, или другое, или оба". Операторы можно комбинировать в любом количестве и любой последовательности, но когда одновременно встречаются &amp;&amp; и ||, то приоритет лучше задавать скобками.</p>
48 <p>Кроме &amp;&amp;, часто используется оператор || - "ИЛИ" (<strong>дизъюнкция</strong>). Он означает "или то, или другое, или оба". Операторы можно комбинировать в любом количестве и любой последовательности, но когда одновременно встречаются &amp;&amp; и ||, то приоритет лучше задавать скобками.</p>
49 <p>Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже увидите<strong>таблицы истинности</strong>- по ним можно определить, каким будет результат, если применить операторы:</p>
49 <p>Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже увидите<strong>таблицы истинности</strong>- по ним можно определить, каким будет результат, если применить операторы:</p>
50 <h3>И &amp;&amp;</h3>
50 <h3>И &amp;&amp;</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>