Перейти к содержимому
Теория · Условия · урок 1 из 8

if, elseif и else

Чему вы научитесь

Чему вы научитесь:

  • выбирать, какие строки выполнит программа, с помощью if, elseif, else и тернарного оператора;
  • предсказывать, какие значения PHP считает ложными, и отличать isset, empty и is_null;
  • объяснять, как switch сравнивает значения и почему без break выполняются следующие case;
  • выбирать между switch и match и объяснять разницу на собеседовании.
Развилка дороги с указателем: if налево, к остановке под дождевой тучей, и else направо, пешком

Программа без условий выполняет все строки подряд, сверху вниз. Но настоящей программе часто нужно выбирать: показать скидку или обычную цену, поздороваться по имени или попросить представиться.

Представьте развилку дороги и указатель на ней: «если идёт дождь, то налево, к автобусу, а иначе направо, пешком». Путник читает указатель, смотрит на небо и уходит по одной из двух дорог. В PHP такой указатель — инструкция if.

Давайте посмотрим на программу, которая выбирает, что напечатать:

PHP
<?php

$temperature = 25;
if ($temperature > 20) {
    echo 'warm', "\n"; // warm
} else {
    echo 'cold', "\n";
}
echo 'done', "\n"; // done

Разберём по шагам:

  1. $temperature = 25; кладёт в переменную число 25.
  2. if ($temperature > 20) вычисляет выражение в круглых скобках: 25 > 20 даёт true.
  3. Раз результат true, PHP выполняет строки в первых фигурных скобках и печатает warm.
  4. Строки после else PHP пропускает.
  5. echo 'done' стоит после всей конструкции и выполняется в любом случае.

Поменяйте 25 на 15: сравнение даст false, PHP пропустит первые скобки, выполнит строки после else и напечатает cold, а затем done.

Условие и ветки

Условие — выражение в круглых скобках после if: PHP вычисляет его и получает true или false. Чаще всего это сравнение (>, <=, ===) или несколько сравнений, связанных через && и ||.

Строки в фигурных скобках называют веткой. Ветки if и else подчиняются пяти правилам:

  • ветка if выполняется, когда условие истинно;
  • ветка else выполняется, когда оно ложно;
  • else можно не писать — тогда при ложном условии не выполнится ничего;
  • из двух веток выполняется ровно одна, никогда обе;
  • фигурные скобки ставят всегда, даже вокруг одной строки.

Цепочка elseif

Когда дорог больше двух, между if и else добавляют ветки elseif — «иначе, если». Давайте разберём программу, которая переводит баллы в оценку:

PHP
$score = 85;
if ($score >= 90) {
    echo 'A', "\n";
} elseif ($score >= 75) {
    echo 'B', "\n"; // B
} elseif ($score >= 50) {
    echo 'C', "\n";
} else {
    echo 'F', "\n";
}

Разберём по шагам:

  1. 85 >= 90 ложно, и ветку A PHP пропускает.
  2. 85 >= 75 истинно, поэтому PHP печатает B.
  3. Дальше PHP не смотрит: условие 85 >= 50 тоже верно, но PHP его не проверяет, и else не выполняется.

Правила цепочки:

  • условия проверяются сверху вниз, по одному;
  • выполняется первая ветка, чьё условие истинно, и только она;
  • остальные ветки пропускаются, даже если их условия тоже верны;
  • else в конце срабатывает, только если не подошло ни одно условие.

Поэтому порядок условий важен: самое узкое ставят первым. Если поднять $score >= 50 на самый верх, программа напечатает C и для 85, и для 99 баллов.

Здесь аналогия с указателем перестаёт работать. Путник видит все дороги сразу и выбирает лучшую, а PHP читает условия по одному и сворачивает на первую подходящую дорогу.

elseif пишут одним словом. Запись else if из двух слов PHP тоже понимает, но в PHP-коде принято elseif.

Внутри ветки можно поставить ещё один if — это вложенное условие. Например, if ($age >= 18) { if ($hasTicket) { … } } проверяет билет только у взрослых. Два уровня вложенности читаются без труда, но глубже код быстро запутывается. Часто вложенный if заменяют одним условием: if ($age >= 18 && $hasTicket).

Тернарный оператор

Иногда ветки нужны только для выбора одного из двух значений. Для этого есть тернарный оператор: $condition ? $a : $b даёт $a, если условие истинно, и $b, если ложно.

PHP
$age = 20;
$ticket = $age >= 18 ? 'adult' : 'child';
echo $ticket, "\n"; // adult
echo $age >= 65 ? 'senior' : 'regular', "\n"; // regular

Разберём по шагам:

  1. $age >= 18 истинно, поэтому оператор даёт 'adult', и это значение попадает в $ticket.
  2. Во второй строке оператор стоит прямо внутри echo: 20 >= 65 ложно, и печатается regular.

Тернарный оператор — выражение: у него есть значение, которое можно присвоить переменной или передать в echo. У if значения нет: он только выбирает, какие строки выполнить.

Как вы уже знаете, у оператора есть короткая форма $a ?: $b — без средней части. А вот два тернарных оператора подряд без скобок PHP 8 не принимает: файл с записью $a ? $b : $c ? $d : $e не запустится вовсе. Для трёх вариантов и больше берите цепочку elseif.

Частая ошибка

Фигурные скобки опустили, и вторая строка ветки оказалась снаружи:

PHP
$age = 15;
if ($age >= 18)
    echo 'adult', "\n";
    echo 'can vote', "\n"; // ✗

PHP разрешает писать if без скобок, но тогда к условию относится только одна следующая инструкция. Отступ ничего не значит, поэтому программа напечатает can vote даже для пятнадцатилетнего. Сообщения об ошибке не будет. Исправление — скобки вокруг обеих строк, и потому в PHP-коде их ставят всегда.

Главное

  • if выполняет свою ветку, когда условие истинно, else — когда ложно; фигурные скобки ставят всегда.
  • В цепочке elseif выполняется только первая ветка с истинным условием, поэтому узкое условие ставят первым.
  • Тернарный оператор $condition ? $a : $b — выражение, которое даёт одно из двух значений.