Урок №3: Управление потоком в PHP
Введение: Почему программа должна думать?
Представь, что ты — робот, который сортирует фрукты. Если ты видишь яблоко — кладёшь его в одну коробку, если апельсин — в другую. Ты не делаешь одно и то же всегда, а принимаешь решения. Точно так же работают программы! В этом уроке мы научим PHP «думать» и выбирать, что делать в разных ситуациях.
В реальной жизни мы постоянно принимаем решения:
- «Если на улице дождь — возьми зонт, иначе — иди без зонта»
- «Если у тебя есть 100 рублей — купи пирожок, если 200 — пирожок и сок»
- «Пока не выучишь уроки — не включай компьютер»
Точно такие же конструкции есть в PHP! Сегодня мы изучим:
- Условные операторы (if, else, elseif) — для выбора действий
- Оператор switch — для множества вариантов
- Тернарный оператор — короткая запись условий
- Циклы (while, for, foreach) — для повторения действий
1. Условный оператор if: «Если… то…»
Самый простой способ заставить программу принимать решения — использовать конструкцию if. Она работает как обычное условие в жизни:
ЕСЛИ (условие верно) ТО (сделай что-то)
Давай напишем программу, которая проверяет, можно ли ребёнку смотреть фильм (возраст должен быть 12+):
= 12) { // если возраст больше или равен 12
echo "Можешь смотреть фильм!"; // это выполнится, если условие верно
}
?>
Разберём по частям:
if— ключевое слово, начинающее условие($age >= 12)— условие в круглых скобках{ ... }— блок кода, который выполнится, если условие истинно>=— оператор сравнения «больше или равно»
Операторы сравнения в PHP:
==— равно (сравнение значений)===— тождественно равно (сравнение значений И типов)!=— не равно>— больше<— меньше>=— больше или равно<=— меньше или равно
Пример с разными условиями:
30) {
echo "Очень жарко, надень шорты!";
}
if ($temperature < 10) {
echo "Холодно, надень куртку!";
}
// Можно комбинировать условия
if ($temperature >= 20 && $temperature <= 25) {
echo "Идеальная погода для прогулки!";
}
?>
Обрати внимание на && — это логический оператор «И». Он означает, что оба условия должны быть истинными. Есть ещё || — «ИЛИ» (хотя бы одно условие истинно).
2. else: «Иначе…»
Часто нужно сделать одно действие, если условие верно, и другое — если нет. Для этого используется else:
Можно записать короче, потому что $hasUmbrella уже является логическим значением (true/false):
Запомни: если переменная уже содержит true/false, не нужно писать == true. Просто используй переменную в условии.
3. elseif: «Иначе если…»
Когда вариантов больше двух, на помощь приходит elseif. Представь, что мы оцениваем оценку ученика:
= 90) {
echo "Отлично! Ты получил 5!";
} elseif ($score >= 75) {
echo "Хорошо! Твоя оценка - 4!";
} elseif ($score >= 50) {
echo "Удовлетворительно. Тройка.";
} else {
echo "К сожалению, это 2. Нужно учить лучше!";
}
?>
Как это работает:
- PHP проверяет первое условие (
$score >= 90). Если оно истинно — выполняет соответствующий блок и выходит из всей конструкции. - Если первое условие ложно — проверяет второе (
$score >= 75), и так далее. - Если ни одно условие не подошло — выполняется блок
else(если он есть).
Важно: порядок условий имеет значение! Если бы мы написали сначала $score >= 50, то при 85 баллах программа сказала бы «тройка», хотя это явно четвёрка. Всегда ставь самые строгие условия первыми.
4. Логические операторы: И, ИЛИ, НЕ
В жизни мы часто комбинируем условия: «Если на улице холодно И идёт дождь, я останусь дома». В PHP для этого есть специальные операторы:
&&(И) — оба условия должны быть истинными||(ИЛИ) — хотя бы одно условие истинно!(НЕ) — отрицание (меняет true на false и наоборот)
Пример с И (&&):
Пример с ИЛИ (||):
Пример с НЕ (!):
Обрати внимание: !$isRaining — это то же самое, что $isRaining == false. Просто короче.
5. Вложенные условия
Иногда одно условие находится внутри другого. Это называется «вложенные условия». Например:
= 18) {
echo "Можешь голосовать!";
} else {
// Если возраст меньше 18, проверяем дополнительно
if ($hasParentalConsent) {
echo "Можешь участвовать с разрешения родителей!";
} else {
echo "Извини, нужно разрешение родителей.";
}
}
?>
Вложенные условия — это нормально, но старайся не делать их слишком глубокими (больше 2-3 уровней), иначе код становится сложным для чтения.
6. Оператор switch: когда много вариантов
Представь, что ты пишешь программу для автомата с напитками. Пользователь нажимает кнопку, и автомат выдаёт определённый напиток. Если использовать if, код будет громоздким. Для таких случаев есть switch:
Как это работает:
switch ($drink)— мы передаём переменную для проверкиcase "cola":— если значение переменной равно "cola", выполняем этот блокbreak;— обязательно! Он прерывает выполнение switch. Без него PHP выполнит все следующие case подряд!default:— выполняется, если ни один case не подошёл (аналог else)while ($bowl > 0)— проверяем условие перед каждой итерацией$bowl--— уменьшаем переменную на 1 (это важно, иначе цикл будет бесконечным!)- Цикл выполняется, пока
$bowl > 0. Как только$bowlстановится 0, условие ложно, и цикл завершается. - Начало:
$i = 1— выполняется один раз в начале - Условие:
$i <= 10— проверяется перед каждой итерацией. Если true — выполняем тело, если false — выходим из цикла - Тело:
echo "Число: $i— то, что повторяется
"; - Шаг:
$i++— выполняется после каждой итерации (увеличиваем счётчик на 1) - Забытые фигурные скобки — если в блоке if/else/while только одна команда, скобки можно не ставить, но лучше всегда ставить для ясности.
- Путаница между = и == —
=это присваивание,==это сравнение. Ошибкаif ($x = 5)всегда будет true! - Бесконечные циклы — всегда проверяй, что условие цикла когда-нибудь станет false.
- Забытый break в switch — без break выполнение «провалится» в следующий case.
- Неправильный порядок условий — в if-elseif более строгие условия должны быть первыми.
- «Утро» — если час от 6 до 11
- «День» — если час от 12 до 17
- «Вечер» — если час от 18 до 22
- «Ночь» — если час от 23 до 5
Пример без break (чтобы понять, почему он важен):
Это называется «проваливание» (fall-through). Иногда это полезно, но чаще — ошибка. Всегда ставь break, если не хочешь такого поведения.
7. Тернарный оператор: короткая запись if-else
Если нужно сделать простой выбор между двумя значениями, можно использовать тернарный оператор. Он работает как сокращённый if-else:
= 18) {
$status = "взрослый";
} else {
$status = "ребёнок";
}
// Тернарный оператор делает то же самое в одну строку:
$status = ($age >= 18) ? "взрослый" : "ребёнок";
echo "Статус: $status";
?>
Структура тернарного оператора:
(условие) ? значение_если_true : значение_если_false
Тернарный оператор удобен для коротких условий, но не злоупотребляй им — если условие сложное, лучше использовать обычный if-else для читаемости.
8. Цикл while: «Пока… делай…»
Циклы позволяют выполнять один и тот же блок кода много раз. Первый цикл — while — работает как «пока условие верно, делай действие».
Аналогия из жизни: «Пока не съешь всю кашу — не встанешь из-за стола». Условие — «каша не съедена», действие — «есть кашу».
0) {
echo "Ем ложку каши... Осталось: $bowl\n";
$bowl--; // уменьшаем количество на 1
}
echo "Каша съедена! Можно гулять!";
?>
Разберём:
Важно: если забыть изменить переменную в условии, получится бесконечный цикл — программа будет выполняться вечно (или до переполнения памяти). Всегда проверяй, что условие когда-нибудь станет ложным.
Пример с бесконечным циклом (не делай так!):
0) {
echo "Бесконечность! ";
// $x никогда не меняется, условие всегда true
}
?>
9. Цикл for: «Повтори N раз»
Цикл for используется, когда мы точно знаем, сколько раз нужно повторить действие. Он компактнее while для таких случаев.
Структура цикла for:
for (начало; условие; шаг) { тело цикла }
Пример: вывести числа от 1 до 10:
";
}
?>
Как это работает пошагово:
Другой пример: таблица умножения на 5:
";
}
?>
Цикл for очень гибкий. Можно шагать не по одному, а, например, по два:
10. Цикл foreach: для массивов
Когда у нас есть массив (список элементов), удобно использовать foreach. Он перебирает каждый элемент массива автоматически.
Пример: список друзей:
";
foreach ($friends as $friend) {
echo "- $friend
";
}
?>
Можно также получить и ключ (индекс) элемента:
5,
"Мария" => 4,
"Пётр" => 3
];
foreach ($students as $name => $grade) {
echo "$name получил оценку: $grade
";
}
?>
Цикл foreach — самый безопасный для массивов, потому что он автоматически проходит по всем элементам и не требует счётчика.
11. break и continue: управление циклами
Иногда нужно прервать цикл досрочно (break) или пропустить текущую итерацию (continue).
break — прерывание цикла:
";
}
?>
continue — пропуск итерации:
continue полезен, когда нужно пропустить обработку некоторых элементов без выхода из цикла.
12. Практические примеры: объединяем всё вместе
Пример 1: Игра «Угадай число»
";
while ($attempts < $maxAttempts) {
$guess = rand(1, 10); // имитация ввода пользователя
$attempts++;
echo "Попытка $attempts: ты называешь $guess
";
if ($guess == $secretNumber) {
echo "Поздравляю! Ты угадал число $secretNumber за $attempts попыток!
";
break;
} elseif ($guess < $secretNumber) {
echo "Моё число больше!
";
} else {
echo "Моё число меньше!
";
}
}
if ($attempts == $maxAttempts && $guess != $secretNumber) {
echo "К сожалению, попытки закончились. Я загадал $secretNumber.
";
}
?>
Пример 2: Калькулятор оценок
Средний балл: $average
";
// Определяем итоговую оценку
if ($average >= 90) {
$grade = 5;
$comment = "Отлично!";
} elseif ($average >= 75) {
$grade = 4;
$comment = "Хорошо!";
} elseif ($average >= 50) {
$grade = 3;
$comment = "Удовлетворительно.";
} else {
$grade = 2;
$comment = "Нужно подтянуть знания!";
}
echo "Итоговая оценка: $grade. $comment";
?>
13. Типичные ошибки новичков
Практические задания
А теперь попробуй сам! Вот три задания разной сложности. Постарайся выполнить их самостоятельно, используя то, что мы сегодня выучили.
Задание 1 (лёгкое): Определитель времени суток
Напиши программу, которая принимает текущий час (от 0 до 23) и выводит:
Используй if-elseif-else. Проверь программу с разными значениями.
Задание 2 (среднее): Таблица умножения
Используя цикл for, выведи таблицу умножения для числа 7 (от 1 до 10). Формат вывода: «7 x 1 = 7», «7 x 2 = 14» и так далее.