Урок 3. Условия и циклы
Программа редко выполняется строго сверху вниз. Чаще ей нужно выбрать: показать форму или сообщение «спасибо», пустить пользователя или нет. А ещё — повторить действие много раз: вывести сто товаров, обойти строки файла. Для выбора служат условия, для повторения — циклы.
if, elseif, else
<?php
$temp = 18;
if ($temp >= 25) {
echo "Жарко\n";
} elseif ($temp >= 15) {
echo "Тепло\n";
} else {
echo "Холодно\n";
}ТеплоPHP проверяет условия по порядку и выполняет первый подходящий блок в фигурных скобках. elseif и else необязательны. Условие пишут в круглых скобках после if.
Сравнение и логика
| Оператор | Значение | Пример, который даёт true |
|---|---|---|
== | равно (с приведением типов) | 5 == "5" |
=== | равно и того же типа | 5 === 5 |
!=, !== | не равно / не идентично | 5 !== "5" |
<, >, <=, >= | меньше, больше | 3 < 10 |
&& | и | $age >= 18 && $age < 65 |
|| | или | $day == 6 || $day == 7 |
! | не | !$isBlocked |
Сравнивайте через ===, если нет причины поступить иначе: == приводит типы, и результат бывает неожиданным. Подробно — в справке Разница между == и ===.
Короткие условия: ?: и ??
<?php
$age = 16;
$status = $age >= 18 ? "взрослый" : "несовершеннолетний";
echo $status . "\n";
$nick = null;
echo ($nick ?? "гость") . "\n";несовершеннолетний
гостьЗапись условие ? да : нет — тернарный оператор: короткая форма if … else, которая возвращает значение. ?? берёт левое значение, если оно есть и не null, иначе — правое. Им удобно задавать значения по умолчанию: $page = $_GET['page'] ?? 1.
match
match появился в PHP 8.0: он сравнивает значение с вариантами и возвращает результат.
<?php
$day = 6;
$name = match ($day) {
1, 2, 3, 4, 5 => "будний день",
6, 7 => "выходной",
default => "нет такого дня",
};
echo $name . "\n";выходнойmatch сравнивает строго, как ===: строка "6" не совпала бы с числом 6. Если ни один вариант не подошёл и нет default, PHP остановит программу ошибкой UnhandledMatchError. Для диапазонов пишут match (true):
<?php
$score = 7;
$grade = match (true) {
$score >= 9 => "отлично",
$score >= 6 => "хорошо",
$score >= 4 => "удовлетворительно",
default => "неудовлетворительно",
};
echo $grade . "\n";хорошоswitch
switch — старший брат match. Он встречается во многих готовых программах, поэтому его нужно узнавать:
<?php
$lang = "be";
switch ($lang) {
case "ru":
echo "Привет\n";
break;
case "be":
echo "Прывітанне\n";
break;
default:
echo "Hello\n";
}ПрывітаннеОтличия от match: сравнение нестрогое (==), и после каждого варианта нужен break. Без него выполнение «проваливается» в следующий case — частая ошибка.
Цикл while
while повторяет блок, пока условие истинно:
<?php
$n = 1;
while ($n <= 5) {
echo $n . " ";
$n++;
}
echo "\n";1 2 3 4 5Если забыть $n++, условие никогда не станет ложным и цикл не закончится. В терминале такую программу останавливают клавишами Ctrl+C. На сайте PHP прерывает скрипт сам через 30 секунд — так задано по умолчанию настройкой max_execution_time.
Цикл for
for удобен, когда число повторений известно. В скобках три части: начало, условие, шаг.
<?php
$sum = 0;
for ($i = 1; $i <= 100; $i++) {
$sum += $i;
}
echo "Сумма от 1 до 100: $sum\n";Сумма от 1 до 100: 5050Сначала $i = 1; перед каждым повтором проверяется $i <= 100; после каждого повтора выполняется $i++.
do-while
do … while проверяет условие после блока, поэтому блок выполняется хотя бы один раз:
<?php
$tries = 0;
do {
$tries++;
echo "Попытка $tries\n";
} while ($tries < 3);Попытка 1
Попытка 2
Попытка 3break и continue
continue пропускает остаток текущего повтора, break выходит из цикла совсем:
<?php
for ($i = 1; $i <= 10; $i++) {
if ($i % 2 == 0) {
continue;
}
if ($i > 7) {
break;
}
echo $i . "\n";
}1
3
5
7Чётные числа пропущены continue, а на девятке сработал break, и цикл закончился раньше десятки.
Условия внутри HTML
В шаблонах страниц вместо фигурных скобок удобна запись с двоеточием — её легче читать среди тегов:
<?php if ($isAdmin): ?>
<a href="/admin">Панель управления</a>
<?php else: ?>
<a href="/login">Войти</a>
<?php endif; ?>Так же пишут foreach … endforeach, for … endfor и while … endwhile.
Частые ошибки
if ($a = 5)вместоif ($a == 5)— одиночный=присваивает, и условие всегда истинно.- Точка с запятой после условия:
if ($a > 0);— блок после неё выполняется всегда. - Забытый
breakвswitch— выполняются и следующие варианты. - Бесконечный цикл — переменная в условии не меняется внутри цикла.
Коротко
if / elseif / elseвыбирают блок по условию; сравнивайте через===.?:— короткое условие со значением,??— значение по умолчанию вместоnull.match(PHP 8) сравнивает строго и возвращает значение;switchсравнивает нестрого и требуетbreak.while— пока условие истинно,for— когда известно число повторов,do … while— хотя бы один раз.continue— к следующему повтору,break— выход из цикла.