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

Программа без условий выполняет все строки подряд, сверху вниз. Но настоящей программе часто нужно выбирать: показать скидку или обычную цену, поздороваться по имени или попросить представиться.
Представьте развилку дороги и указатель на ней: «если идёт дождь, то налево, к автобусу, а иначе направо, пешком». Путник читает указатель, смотрит на небо и уходит по одной из двух дорог. В PHP такой указатель — инструкция if.
Давайте посмотрим на программу, которая выбирает, что напечатать:
<?php
$temperature = 25;
if ($temperature > 20) {
echo 'warm', "\n"; // warm
} else {
echo 'cold', "\n";
}
echo 'done', "\n"; // doneРазберём по шагам:
$temperature = 25;кладёт в переменную число25.if ($temperature > 20)вычисляет выражение в круглых скобках:25 > 20даётtrue.- Раз результат
true, PHP выполняет строки в первых фигурных скобках и печатаетwarm. - Строки после
elsePHP пропускает. echo 'done'стоит после всей конструкции и выполняется в любом случае.
Поменяйте 25 на 15: сравнение даст false, PHP пропустит первые скобки, выполнит строки после else и напечатает cold, а затем done.
Условие и ветки
Условие — выражение в круглых скобках после if: PHP вычисляет его и получает true или false. Чаще всего это сравнение (>, <=, ===) или несколько сравнений, связанных через && и ||.
Строки в фигурных скобках называют веткой. Ветки if и else подчиняются пяти правилам:
- ветка
ifвыполняется, когда условие истинно; - ветка
elseвыполняется, когда оно ложно; elseможно не писать — тогда при ложном условии не выполнится ничего;- из двух веток выполняется ровно одна, никогда обе;
- фигурные скобки ставят всегда, даже вокруг одной строки.
Цепочка elseif
Когда дорог больше двух, между if и else добавляют ветки elseif — «иначе, если». Давайте разберём программу, которая переводит баллы в оценку:
$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";
}Разберём по шагам:
85 >= 90ложно, и веткуAPHP пропускает.85 >= 75истинно, поэтому PHP печатаетB.- Дальше 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, если ложно.
$age = 20;
$ticket = $age >= 18 ? 'adult' : 'child';
echo $ticket, "\n"; // adult
echo $age >= 65 ? 'senior' : 'regular', "\n"; // regularРазберём по шагам:
$age >= 18истинно, поэтому оператор даёт'adult', и это значение попадает в$ticket.- Во второй строке оператор стоит прямо внутри
echo:20 >= 65ложно, и печатаетсяregular.
Тернарный оператор — выражение: у него есть значение, которое можно присвоить переменной или передать в echo. У if значения нет: он только выбирает, какие строки выполнить.
Как вы уже знаете, у оператора есть короткая форма $a ?: $b — без средней части. А вот два тернарных оператора подряд без скобок PHP 8 не принимает: файл с записью $a ? $b : $c ? $d : $e не запустится вовсе. Для трёх вариантов и больше берите цепочку elseif.
Частая ошибка
Фигурные скобки опустили, и вторая строка ветки оказалась снаружи:
$age = 15;
if ($age >= 18)
echo 'adult', "\n";
echo 'can vote', "\n"; // ✗PHP разрешает писать if без скобок, но тогда к условию относится только одна следующая инструкция. Отступ ничего не значит, поэтому программа напечатает can vote даже для пятнадцатилетнего. Сообщения об ошибке не будет. Исправление — скобки вокруг обеих строк, и потому в PHP-коде их ставят всегда.
Главное
ifвыполняет свою ветку, когда условие истинно,else— когда ложно; фигурные скобки ставят всегда.- В цепочке
elseifвыполняется только первая ветка с истинным условием, поэтому узкое условие ставят первым. - Тернарный оператор
$condition ? $a : $b— выражение, которое даёт одно из двух значений.