Глиф Учебники

Урок 3. Условия и циклы

Курс «PHP» · урок 3 из 10 · 3 минуты чтения

Программа редко выполняется строго сверху вниз. Чаще ей нужно выбрать: показать форму или сообщение «спасибо», пустить пользователя или нет. А ещё — повторить действие много раз: вывести сто товаров, обойти строки файла. Для выбора служат условия, для повторения — циклы.

if, elseif, else

PHP
<?php
$temp = 18;
if ($temp >= 25) {
    echo "Жарко\n";
} elseif ($temp >= 15) {
    echo "Тепло\n";
} else {
    echo "Холодно\n";
}
Вывод
Тепло

PHP проверяет условия по порядку и выполняет первый подходящий блок в фигурных скобках. elseif и else необязательны. Условие пишут в круглых скобках после if.

$temp = 18; $temp >= 25 да echo "Жарко\n"; нет $temp >= 15 да echo "Тепло\n"; нет echo "Холодно\n"; при 18 18 >= 25 false 18 >= 15 true до else не дошло
При $temp = 18 условие $temp >= 25 даёт false, а $temp >= 15 — true: выполняется echo "Тепло\n", а до блока else дело не доходит.

Сравнение и логика

ОператорЗначениеПример, который даёт true
==равно (с приведением типов)5 == "5"
===равно и того же типа5 === 5
!=, !==не равно / не идентично5 !== "5"
<, >, <=, >=меньше, больше3 < 10
&&и$age >= 18 && $age < 65
||или$day == 6 || $day == 7
!не!$isBlocked

Сравнивайте через ===, если нет причины поступить иначе: == приводит типы, и результат бывает неожиданным. Подробно — в справке Разница между == и ===.

Короткие условия: ?: и ??

PHP
<?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
<?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
<?php
$score = 7;
$grade = match (true) {
    $score >= 9 => "отлично",
    $score >= 6 => "хорошо",
    $score >= 4 => "удовлетворительно",
    default => "неудовлетворительно",
};
echo $grade . "\n";
Вывод
хорошо

switch

switch — старший брат match. Он встречается во многих готовых программах, поэтому его нужно узнавать:

PHP
<?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
<?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
<?php
$sum = 0;
for ($i = 1; $i <= 100; $i++) {
    $sum += $i;
}
echo "Сумма от 1 до 100: $sum\n";
Вывод
Сумма от 1 до 100: 5050

Сначала $i = 1; перед каждым повтором проверяется $i <= 100; после каждого повтора выполняется $i++.

for ($i = 1; $i <= 100; $i++) { начало условие шаг $i = 1 один раз $i <= 100 да $sum += $i; $i++ снова нет выход $i $sum 1 1 2 3 3 6 … 100 5050 101 выход
Начало $i = 1 выполняется один раз, перед каждым повтором проверяется $i <= 100, после тела $sum += $i идёт шаг $i++; при $i = 101 цикл заканчивается, в $sum — 5050.

do-while

do … while проверяет условие после блока, поэтому блок выполняется хотя бы один раз:

PHP
<?php
$tries = 0;
do {
    $tries++;
    echo "Попытка $tries\n";
} while ($tries < 3);
Вывод
Попытка 1
Попытка 2
Попытка 3

break и continue

continue пропускает остаток текущего повтора, break выходит из цикла совсем:

PHP
<?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, и цикл закончился раньше десятки.

вывод 1 1 continue 2 3 3 continue 4 5 5 continue 6 7 7 continue 8 break 9 не дошло 10
Нечётные 1, 3, 5, 7 выводятся, чётные пропускает continue, на 9 срабатывает break, и до 10 цикл уже не доходит.

Условия внутри HTML

В шаблонах страниц вместо фигурных скобок удобна запись с двоеточием — её легче читать среди тегов:

PHP
<?php if ($isAdmin): ?>
    <a href="/admin">Панель управления</a>
<?php else: ?>
    <a href="/login">Войти</a>
<?php endif; ?>

Так же пишут foreach … endforeach, for … endfor и while … endwhile.

Частые ошибки

Коротко

Проверьте себя

1. Что выведет программа?
PHP
<?php
$x = "5";
echo match ($x) {
    5 => "число",
    "5" => "строка",
    default => "другое",
};
2. Сколько раз выполнится тело цикла for ($i = 0; $i < 5; $i++)?
3. Чем do … while отличается от while?
4. Что вернёт null ?? "гость"?