Мы уже знакомились на прошлом уроке с булевым типом данных. Переменная типа bool
может содержать только два значения: true или false, при чем это не строки, не числа, а именно понятия ложь и истина.
$bool1 = true;
$bool2 = false;
Для работы с булевыми переменными существует булева алгебра.
Существуют следующие логические операторы:
- && - И
- || - ИЛИ
- xor - Исключающее ИЛИ
- ! - НЕ
not означает НЕ, и, будучи поставленным перед типом bool, меняет его значение на обратное, т.е. not True
становится False
,not False
становится True
Далее приведена таблица, демонстрирующая работу операторов:
0 to 0 | 0 to 1 | 1 to 0 | 1 to 1 | |
---|---|---|---|---|
&& | 0 | 0 | 0 | 1 |
|| | 0 | 1 | 1 | 1 |
xor | 0 | 1 | 1 | 0 |
Простейшая программа выполняется сверху вниз от первой строки к последней. Для того, чтобы изменить порядок выполнения программы, используются управляющие структуры. Существуют управляющие структуры нескольких типов:
- операторы условия
- операторы цикла
- операторы подключения других файлов
- операторы для вмешательства в работу цикла или функции прочие операторы Полный список
Существуют следующие операторы условия:
- if -> elseif ->else
- ?: (тернарный оператор)
- switch->case->break
Рассмотрим каждый подробнее на примере конкретного кода:
<?php
echo "Give it to me!\n";
$handle = fopen ("php://stdin","r");
$number = fgets($handle);
if ($number > 100) {
echo "Thanks, man!";
} elseif (($number > 10) && ($number < 100)) {
echo "OK :(";
} else echo "WHAAAAT????";
echo "\n";
if ($number > 1000) echo "\n!!!!WOOOOWWWW!!!\n";
Обратите внимание, мы впервые сталкиваемся с блоком операторов. Так же будет и у циклов, и у функций, и у классов, и у их методов, и так далее. блок операторов начинается со своего инициатора (например, сейчас это блок оператора if
), после инициатора ставится фигурная скобка, затем все действия, которые программист хочет выполнять в рамках этого блока, он должен выполнять после одного дополнительного отступа. Если отступа не будет, php сработает, ошибки не будет, но отступы нужны программисту и его коллегам, чтобы визуально понимать, к какому блоку относится строка кода.
Как видно из листинга, есть возможность применять оператор if в нескольких вариантах. Ниже приведен список всех вариантов:
- if (условие) действие
- if (условие) {блок действий в несколько строк}
- if (условие) {блок действий в несколько строк} else действие
- if (условие) {блок действий в несколько строк} else {блок действий в несколько строк}
- if (условие) {блок действий в несколько строк} elseif(условие) {блок действий в несколько строк} else действие
- if (условие) {блок действий в несколько строк} elseif(условие) {блок действий в несколько строк} else {блок действий в несколько строк}
Между if и else может быть сколько угодно elseif.
Оператор switch в основном используется в тех случаях, когда в зависимости от содержимого переменной необходимо выполнить более двух вариантов действий, и является альтернативой конструкции if-elseif-elseif....else.:
<?php
echo "Give me the mark!\n";
$handle = fopen ("php://stdin","r");
$mark = fgets($handle);
switch ($mark) {
case 2:
echo "I am better!!";
break;
case 3:
echo "OK :(";
break;
case 4:
echo "I am good :)";
break;
case 5:
echo "YeeeeWhaaaa!!!!";
break;
}
echo "\n";
Тернарные операторы часто применяются, когда варианта всего два, так как такая запись короче аналогичного действия с if
. Однако, к сожалению, можно встретить связку if
и тернарных операторов, которую совершенно невозможно прочесть. Другими словами, это не необходимая вещь в языке и она может стать причиной нечитаемого текста.
Ниже приведен пример тернарного оператора:
<?php
echo "If you are a man, press 1!\n";
$handle = fopen ("php://stdin","r");
$input = fgets($handle);
echo ($input == 1) ? "MAAAN!" : "Hey, girl!";
echo "\n";
В свете того, что php является языком с нестрогой динамической типизацией, ему присущи довольно оригинальные выводы, когда дело касается определения, является ли содержимое скобок какого-либо условия правдой или ложью.
PHP считает, что если объект не пуст, он True
, а не False
. False
- это собственно сам False
, 0, пустая строка, пустой массив, null
и даже строка, в которой записан '0'.
Полный список всех вариантов можно посмотреть по ссылке: таблицы сравнения типов
Как извлечь из этого выгоду и как этим пользоваться? Если нам необходимо сравнить строку с пустой строкой, или число с нулем, а так же узнать, является ли пустым тот или иной объект, вместо того, чтобы писать условия в стиле старых языков:
if ($s !='') echo $s;
if (9 % 2 != 0) echo 'not zero!';
можно слегка их сократить:
if ($s) echo $s;
if (9 % 2) echo 'not zero!';
Это значительно сокращает и упрощает код.
Задача fizz-buzz:
У вас есть три числа, они вводятся из консоли (использовать функцию fopen
). Первое число называется fizz, второе называется buzz. До третьего необходимо досчитать от единицы. Считая, надо выводить число. Если число кратно fizz - надо выводить F вместо числа. Если число кратно buzz - надо выводить B вместо числа. Если число кратно и fizz и buzz, надо выводить FB. И так - пока не будет достигнуто третье введенное число.
Пример условия и результата:
Введены числа 2, 5, 18
Вывод должен быть таким:
1 F 3 F B F 7 F 9 FB 11 F 13 F B F 17 F