nmk

Лекція 3 (2 години). Керуючі конструкції: умови та цикли

План лекції

  1. Умовний оператор if-else та конструкція elseif. Тернарний оператор.
  2. Альтернативний синтаксис (Switch та Match).
  3. Цикли: while і do-while.
  4. Цикл for. Робота з ітераторами.

Перелік умовних скорочень

Вступ

Світ не лінійний. Сайти не можуть завжди працювати однаково (послідовно згори донизу). Керування потоком програми дозволяє застосункам бути “розумними” — приймати рішення в залежності від дій користувача. Якщо він адміністратор — показати панель керування продуктами, в іншому випадку (else) — просто показати кошик зі статтями. Якщо в кошику 100 товарів, нам не потрібно писати HTML код 100 разів; для цього (щоб вивести їх) створюються цикли.


1. Умовний оператор if-else та elseif

Головний оператор розгалуження (branching) у всіх мовах. Він перевіряє вираз. Якщо вираз повертає true (істина), виконується перший блок інструкцій. Якщо false (хибність) — інтерпретатор перестрибує ці фігурні дужки { }.

Синтаксис if-elseif-else

<?php
$userAge = 15;

if ($userAge >= 18) {
    echo "Вам дозволено доступ. Показуємо каталог.";
} elseif ($userAge === 17) {
    // Цей блок виконається ТІЛЬКИ якщо перша умова (>= 18) була false,
    // і ми рівно 17 річні.
    echo "Зачекайте ще один рік!";
} else {
    // Всі інші варіанти (менше 17) "падають" сюди
    echo "Вам заборонено доступ. Дивіться мультики.";
}
?>

Важливо: elseif можна додавати скільки завгодно. Блок else завжди розміщується тільки в кінці і є необов’язковим.

Альтернативний синтаксис для HTML (з двокрапкою :)

Коли програміст пише PHP-блок, який рендерить багатий на теги HTML контент, використовувати фігурні дужки { надзвичайно складно (вони губляться поміж <div>). PHP створив спеціальний запис для “шаблонів”: замість початку блоку ставиться двокрапка :, а в кінці — endif;.

<?php $isLogged = true; ?>

<?php if ($isLogged): ?>
<div class="user-block">
  <h3>Привіт, Адмін!</h3>
</div>
<?php else: ?>
<a href="login.php">Будь ласка, увійдіть у систему</a>
<?php endif; ?>

Тернарний оператор (Лінійний IF)

Короткий (в 1 рядок) запис умовного оператора, коли вам просто потрібно призначити один із двох варіантів змінній. Синтаксис: (Умова) ? [Якщо ТАК] : [Якщо НІ];

<?php
$score = 80;
// Звичайний if займає 5 рядків.
// Тернарний виглядає так:
$resultMsg = ($score >= 60) ? "Екзамен складено!" : "Ви не склали. Перездача.";
echo $resultMsg;
?>

2. Альтернативний синтаксис (Switch та Match)

Коли у вас є дуже багато варіантів (наприклад: що робити, якщо статус платежу ‘pending’, ‘paid’, ‘canceled’, ‘refunded’?), конструкція elseif стає надто громіздкою.

switch структура

switch приймає єдину змінну, і далі шукає совпадіння (case) серед різних варіантів:

<?php
$role = 'Moderator';

switch ($role) {
    case 'Admin':
        echo "Ви маєте всі права в системі.";
        break; // Обов'язкова зупинка! Якщо забути, код поїде вниз по всіх case
    case 'Moderator':
        echo "Вам дозволено видаляти коментарі.";
        break;
    default:
        // Це аналог 'else' (якщо нічого не підійшло з гори)
        echo "Ви звичайний Гість.";
        break;
}
?>

match вираз (Сучасний PHP 8.0+)

PHP еволюціонує і додав структуру match. Вона робить те ж саме, що й switch, проте з 3-ма перевагами:

  1. Використовує строге порівняння (===).
  2. Не потрібні ключові слова break;. Можна забути про помилки “випадкового провалу вниз”.
  3. Повертає значення-результат одразу напряму!
$statusId = 3;
$statusMessage = match ($statusId) {
    1 => 'Очікує оплати',
    2 => 'В обробці',
    3 => 'Успішно',   // Код вибере цей варіант
    default => 'Невідомий статус'
};
echo "Замовлення зараз: " . $statusMessage;

3. Цикли: while і do-while

Головне правило розробника: не копіюйте код вручну. Якщо треба вивести список з 20 коментарів, треба вказати комп’ютеру “Блоки ітерації”.

Цикл з передумовою while (поки)

Виконує блок інструкцій у тілі доти, доки умова всередині дужок залишається true. Якщо умова спочатку є false — цикл не виконається взагалі (жодного разу).

<?php
$batteryLevel = 5;

// Читати як: "ПОКИ батарея більша або рівна 1 відсотку..."
while ($batteryLevel >= 1) {
    echo "Залишок: {$batteryLevel}% <br>";
    $batteryLevel--; // Обов'язковий лічильник зменшення! (Декремент)
    // Без нього цикл стане НЕСКІНЧЕННИМ, і сервер зависне ("закрашиться").
}
echo "Батарея розряджена!";
?>

Цикл з постумовою do-while

Єдина відмінність від while — умова перевіряється не ПЕРЕД початком, а ПІСЛЯ завершення блоку. Це гарантує, що код виконається принаймні один раз, навіть якщо умова уже одразу false.

<?php
$x = 100;

do {
    echo "Цей текст виведеться ГАРАНТОВАНО 1 раз, хоча 100 не менше 10.";
} while ($x < 10);
?>

4. Цикл for та управління ітераторами

Найулюбленіший цикл в алгоритміці. Він інкапсулює (“пакує”) всі три складові звичайного цикла (ініціалізацію лічильника, умову, крок інкременту) на одному зручному рядочку для розуміння.

Синтаксис: for (ПОЧАТОК; УМОВА ПРОДОВЖЕННЯ; КРОК НАПРИКІНЦІ) { ... }

<?php
// Виводимо квадрат числа від 1 до 10:
for ($i = 1; $i <= 10; $i++) {
    // 1-ша ітерація: $i = 1
    // 2-га ітерація: $i = 2 (після інкременту $i++)
    echo "Квадрат числа $i дорівнює " . ($i * $i) . "<br>";
}
// Якщо нам треба рухатися у зворотньому напрямі через один елемент:
// for ($k = 100; $k > 0; $k -= 2)
?>

Управління потоком: break і continue

Іноді треба втрутитися в логіку цикла “на льоту”.

<?php
for ($i = 1; $i <= 10; $i++) {
    if ($i === 5) {
        // Ми не виведемо цифру 5 і перейдемо до 6-ї!
        continue;
    }
    echo "Лічильник: $i <br>";
}
?>

Висновки

  1. Умови (if/else) формують інтелект програми, дозволяючи обробляти різні сценарії розвитку подій.
  2. Тернарний оператор — швидкий інструмент для перевірки простої умови й присвоєння змінній результату (напр. в атрибутах HTML).
  3. Сучасний метод match (в PHP 8) — елегантніший і строго типізований замінник старих конструкцій switch-case.
  4. Цикли (while, for) — інструмент №1 для автоматизації рутини та реалізації принципу DRY. При їх написанні вкрай важливо слідкувати за ітератором ++ / --, аби не організувати “нескінченний (мертвий) цикл” (Infinite Loop).

Джерела

  1. Офіційний мануал. If / Else: https://www.php.net/manual/ru/language.control-structures.php
  2. Синтаксис Match: https://www.php.net/manual/ru/control-structures.match.php

Запитання для самоперевірки

  1. Чому використання альтернативного синтаксису (через :) під час виведення HTML-тегів є кращою практикою, ніж обгортання кожного HTML-тегу в великі фігурні скобки { echo "<div>"; }?
  2. Як правильно використовувати тернарний оператор і чим він відрізняється від класичного блоку if?
  3. Які 3 головні переваги структури match порівняно зі старими конструкціями switch-case? Який вид порівняння (строгий чи ні) застосовує match?
  4. З яких 3 ключових аргументів (виразів) складається стандартний цикл for?
  5. У чому практична різниця між ключовими словами break та continue? Наведіть приклади их використання під час ітерації.