6. Условия
Введение
Заголовок раздела «Введение»Условные операторы позволяют выполнять разный код в зависимости от условий. Это основа логики любой программы — возможность принимать решения.
Что вы узнаете
Заголовок раздела «Что вы узнаете»- Оператор if/else
- Оператор elseif
- Вложенные условия
- Switch/case
- Match expression (PHP 8+)
- Тернарный оператор
- Логические операторы в условиях
Оператор if
Заголовок раздела «Оператор if»Выполняет код только если условие истинно.
<?php$age = 20;
if ($age >= 18) { echo "Вы совершеннолетний";}
// С фигурными скобками (рекомендуется всегда)if ($age >= 18) { echo "Вы совершеннолетний"; echo "<br>Добро пожаловать!";}
// Без фигурных скобок (только одна инструкция)if ($age >= 18) echo "Вы совершеннолетний"; // ❌ Не рекомендуется?>```text
### Условия могут быть любыми выражениями
```php<?php// Переменныеif ($is_logged_in) { echo "Добро пожаловать!";}
// Функцииif (file_exists("config.php")) { require "config.php";}
// Сравненияif ($price > 1000) { echo "Дорогой товар";}
// Сложные выраженияif ($age >= 18 && $has_license) { echo "Можете водить машину";}?>```text
## Оператор if/else
Выполняет один код если условие истинно, другой — если ложно.
```php<?php$age = 15;
if ($age >= 18) { echo "Вы совершеннолетний";} else { echo "Вы несовершеннолетний";}
// Практический пример$hour = date("H");
if ($hour < 12) { $greeting = "Доброе утро";} else { $greeting = "Добрый день";}
echo $greeting;?>```text
### Примеры из практики
```php<?php// Проверка четности$number = 42;
if ($number % 2 == 0) { echo "$number — четное число";} else { echo "$number — нечетное число";}
// Проверка авторизацииif (isset($_SESSION['user_id'])) { echo "Добро пожаловать, " . $_SESSION['username'];} else { echo '<a href="login.php">Войти</a>';}
// Проверка скидки$total = 5500;
if ($total >= 5000) { $discount = $total * 0.10; $final = $total - $discount; echo "Скидка 10%: $final руб";} else { echo "Сумма: $total руб (без скидки)";}?>```text
## Оператор elseif
Проверяет несколько условий по очереди.
```php<?php$score = 85;
if ($score >= 90) { $grade = "A";} elseif ($score >= 80) { $grade = "B";} elseif ($score >= 70) { $grade = "C";} elseif ($score >= 60) { $grade = "D";} else { $grade = "F";}
echo "Ваша оценка: $grade";?>```text
### Порядок проверки важен
```php<?php$age = 25;
// ✅ Правильноif ($age < 13) { echo "Ребенок";} elseif ($age < 20) { echo "Подросток";} elseif ($age < 65) { echo "Взрослый";} else { echo "Пенсионер";}
// ❌ Неправильно (все попадет в первое условие)if ($age < 65) { echo "Взрослый"; // 25 < 65, сработает это} elseif ($age < 20) { echo "Подросток"; // Сюда никогда не дойдет}?>```text
### Практические примеры
```php<?php// Тарификация доставки$weight = 5; // кг
if ($weight <= 1) { $shipping = 200;} elseif ($weight <= 5) { $shipping = 350;} elseif ($weight <= 10) { $shipping = 500;} else { $shipping = 700;}
echo "Стоимость доставки: $shipping руб";
// Определение времени суток$hour = date("H");
if ($hour >= 5 && $hour < 12) { $time_of_day = "утро";} elseif ($hour >= 12 && $hour < 17) { $time_of_day = "день";} elseif ($hour >= 17 && $hour < 22) { $time_of_day = "вечер";} else { $time_of_day = "ночь";}
echo "Сейчас $time_of_day";?>```text
## Вложенные условия
Условия внутри условий.
```php<?php$age = 25;$has_license = true;
if ($age >= 18) { if ($has_license) { echo "Можете водить машину"; } else { echo "Нужно получить права"; }} else { echo "Вы слишком молоды для вождения";}
// Лучше переписать с логическими операторамиif ($age >= 18 && $has_license) { echo "Можете водить машину";} elseif ($age >= 18) { echo "Нужно получить права";} else { echo "Вы слишком молоды для вождения";}?>```text
### Избегайте глубокой вложенности
```php<?php// ❌ Плохо: сложно читатьif ($is_logged_in) { if ($has_subscription) { if ($subscription_active) { if ($content_available) { echo "Показываем контент"; } else { echo "Контент недоступен"; } } else { echo "Подписка истекла"; } } else { echo "Купите подписку"; }} else { echo "Войдите в систему";}
// ✅ Лучше: ранний выход (guard clauses)if (!$is_logged_in) { echo "Войдите в систему"; exit;}
if (!$has_subscription) { echo "Купите подписку"; exit;}
if (!$subscription_active) { echo "Подписка истекла"; exit;}
if (!$content_available) { echo "Контент недоступен"; exit;}
echo "Показываем контент";?>```text
## Оператор switch/case
Альтернатива множественным if/elseif для проверки одной переменной.
```php<?php$day = date("w"); // 0 (вс) - 6 (сб)
switch ($day) { case 0: echo "Воскресенье"; break; case 1: echo "Понедельник"; break; case 2: echo "Вторник"; break; case 3: echo "Среда"; break; case 4: echo "Четверг"; break; case 5: echo "Пятница"; break; case 6: echo "Суббота"; break; default: echo "Неизвестный день";}?>```text
### Важность break
```php<?php$role = "editor";
// ❌ Без break — "проваливается" дальшеswitch ($role) { case "admin": echo "Полный доступ<br>"; case "editor": echo "Может редактировать<br>"; case "author": echo "Может писать<br>"; case "subscriber": echo "Может читать<br>";}// Выведет все от "editor" и ниже!
// ✅ С break — останавливаетсяswitch ($role) { case "admin": echo "Полный доступ"; break; case "editor": echo "Может редактировать"; break; case "author": echo "Может писать"; break; case "subscriber": echo "Может читать"; break; default: echo "Нет доступа";}?>```text
### Группировка case
```php<?php$day = date("w");
switch ($day) { case 0: case 6: echo "Выходной день"; break;
case 1: case 2: case 3: case 4: case 5: echo "Рабочий день"; break;
default: echo "Неизвестный день";}
// Можно использовать для нескольких значений$action = $_GET['action'] ?? '';
switch ($action) { case 'edit': case 'update': case 'modify': handleEdit(); break;
case 'delete': case 'remove': handleDelete(); break;
case 'view': case 'show': case 'display': handleView(); break;
default: show404();}?>```text
### switch vs if/elseif
```php<?php// ✅ Switch удобнее для точных совпаденийswitch ($status) { case 'active': // ... break; case 'pending': // ... break; case 'inactive': // ... break;}
// ✅ if/elseif лучше для диапазоновif ($age < 18) { // ...} elseif ($age < 65) { // ...} else { // ...}?>```text
## Match expression (PHP 8+)
Современная альтернатива switch с некоторыми преимуществами.
```php<?php$day = date("w");
// switch (старый стиль)switch ($day) { case 0: $dayName = "Воскресенье"; break; case 1: $dayName = "Понедельник"; break; case 2: $dayName = "Вторник"; break; // ...}
// match (PHP 8+, новый стиль)$dayName = match($day) { 0 => "Воскресенье", 1 => "Понедельник", 2 => "Вторник", 3 => "Среда", 4 => "Четверг", 5 => "Пятница", 6 => "Суббота", default => "Неизвестный день"};
echo $dayName;?>```text
### Преимущества match
```php<?php// 1. Строгое сравнение (===)$value = "1";
// switch использует ==switch ($value) { case 1: echo "Число"; // ✓ Сработает (слабое сравнение) break;}
// match использует ===$result = match($value) { 1 => "Число", // ✗ НЕ сработает (строгое сравнение) "1" => "Строка", // ✓ Сработает};
// 2. Не нужен break$result = match($status) { 'draft' => 'Черновик', 'published' => 'Опубликовано', 'archived' => 'В архиве',};
// 3. Возвращает значение$message = match($code) { 200 => 'OK', 404 => 'Not Found', 500 => 'Server Error', default => 'Unknown'};
// 4. Несколько условий$type = match($extension) { 'jpg', 'jpeg', 'png', 'gif' => 'image', 'mp4', 'avi', 'mov' => 'video', 'pdf', 'doc', 'docx' => 'document', default => 'unknown'};
// 5. Выражения в условиях$category = match(true) { $age < 13 => 'child', $age < 20 => 'teenager', $age < 65 => 'adult', default => 'senior'};?>```text
## Тернарный оператор
Краткая запись if/else.
```php<?php// Синтаксис: условие ? значение_если_true : значение_если_false
$age = 20;$status = ($age >= 18) ? "взрослый" : "ребенок";
// То же самое с if/elseif ($age >= 18) { $status = "взрослый";} else { $status = "ребенок";}
// Примеры$is_weekend = (date("w") == 0 || date("w") == 6) ? true : false;$greeting = $is_logged_in ? "Добро пожаловать" : "Войдите";$price_class = ($price > 1000) ? "expensive" : "cheap";?>```text
### Вложенный тернарный оператор
```php<?php$score = 85;
// ⚠️ Можно, но сложно читать$grade = ($score >= 90) ? "A" : ($score >= 80) ? "B" : ($score >= 70) ? "C" : ($score >= 60) ? "D" : "F";
// ✅ Лучше использовать if/elseif или matchif ($score >= 90) { $grade = "A";} elseif ($score >= 80) { $grade = "B";} elseif ($score >= 70) { $grade = "C";} elseif ($score >= 60) { $grade = "D";} else { $grade = "F";}?>```text
### Elvis operator и null coalescing
```php<?php// Elvis ?: (вернет первое truthy значение)$username = $_GET['user'] ?: 'Гость';
// Null coalescing ?? (вернет первое не-null)$username = $_GET['user'] ?? 'Гость';
// Разница$value = 0;echo $value ?: 'default'; // "default" (0 falsy)echo $value ?? 'default'; // "0" (0 существует)
// Цепочка$config = $user_config ?? $app_config ?? $default_config;?>```text
## Логические операторы в условиях
### AND (&&) — истина если оба true
```php<?php$age = 25;$has_license = true;
if ($age >= 18 && $has_license) { echo "Можете водить";}
// Можно комбинировать много условийif ($is_logged_in && $is_verified && $has_subscription && !$is_banned) { echo "Доступ разрешен";}?>```text
### OR (||) — истина если хотя бы один true
```php<?php$is_admin = false;$is_moderator = true;
if ($is_admin || $is_moderator) { echo "У вас есть права модерации";}
// Проверка нескольких значений$payment_method = "card";
if ($payment_method == "card" || $payment_method == "paypal" || $payment_method == "crypto") { echo "Онлайн оплата";}
// Лучше использовать in_arrayif (in_array($payment_method, ["card", "paypal", "crypto"])) { echo "Онлайн оплата";}?>```text
### NOT (!) — инверсия
```php<?phpif (!$is_logged_in) { redirect('login.php'); exit;}
if (!empty($errors)) { displayErrors($errors);}
if (!file_exists($filename)) { echo "Файл не найден";}?>```text
### Комбинирование операторов
```php<?php// Скобки для группировкиif (($is_admin || $is_moderator) && $is_verified) { echo "Доступ к панели управления";}
// Без скобок может работать не так как ожидаетсяif ($is_admin || $is_moderator && $is_verified) { // && имеет приоритет выше чем || // Эквивалентно: $is_admin || ($is_moderator && $is_verified)}
// Guard clauses (ранний выход)if (!$is_logged_in) { show_login_form(); exit;}
if (!$has_permission) { show_access_denied(); exit;}
// Если дошли сюда, значит пользователь залогинен и имеет праваshow_content();?>```text
## WordPress контекст
Условия широко используются в WordPress.
### Conditional Tags
```php<?php// Проверка типа страницыif (is_home()) { echo "Это главная страница блога";}
if (is_single()) { echo "Это отдельный пост";}
if (is_page('about')) { echo "Это страница 'О нас'";}
// Комбинированиеif (is_single() || is_page()) { echo "Это отдельная страница или пост";}
// Проверка категорииif (is_category('news')) { echo "Категория Новости";}
// В циклеif (have_posts()) { while (have_posts()) { the_post(); // Вывод поста }} else { echo "Посты не найдены";}?>```text
### Проверка прав пользователя
```php<?phpif (is_user_logged_in()) { echo "Добро пожаловать, " . wp_get_current_user()->display_name;
if (current_user_can('edit_posts')) { echo '<a href="' . admin_url('post-new.php') . '">Создать пост</a>'; }
if (current_user_can('manage_options')) { echo '<a href="' . admin_url() . '">Админ-панель</a>'; }} else { echo '<a href="' . wp_login_url() . '">Войти</a>';}?>```text
### Условный вывод в теме
```php<?php// Показываем сайдбар только на определенных страницахif (!is_page('checkout') && !is_page('cart')) { get_sidebar();}
// Разный футер для разных страницif (is_front_page()) { get_template_part('footer', 'home');} else { get_footer();}
// Кастомный заголовокif (is_singular()) { $title = get_the_title();} elseif (is_category()) { $title = single_cat_title('', false);} elseif (is_tag()) { $title = single_tag_title('', false);} else { $title = get_bloginfo('name');}
echo "<h1>$title</h1>";?>```text
### Условия в WP_Query
```php<?php$args = [ 'post_type' => 'product', 'posts_per_page' => 10];
// Добавляем фильтр по категории если передан параметрif (isset($_GET['category'])) { $args['category_name'] = sanitize_text_field($_GET['category']);}
// Добавляем сортировкуif (isset($_GET['orderby'])) { $orderby = sanitize_text_field($_GET['orderby']);
switch ($orderby) { case 'price_asc': $args['meta_key'] = '_price'; $args['orderby'] = 'meta_value_num'; $args['order'] = 'ASC'; break;
case 'price_desc': $args['meta_key'] = '_price'; $args['orderby'] = 'meta_value_num'; $args['order'] = 'DESC'; break;
case 'name': $args['orderby'] = 'title'; $args['order'] = 'ASC'; break; }}
$query = new WP_Query($args);?>```text
## Практика
### Задание 1: Калькулятор оценок
Создайте скрипт, который преобразует баллы (0-100) в оценки (A-F).
### Задание 2: Проверка возраста
Создайте форму ввода возраста и определите категорию:- 0-12: ребенок- 13-19: подросток- 20-64: взрослый- 65+: пенсионер
### Задание 3: Калькулятор скидок
Рассчитайте скидку:- < 1000: нет скидки- 1000-5000: 5%- 5000-10000: 10%- > 10000: 15%
### Задание 4: Определение сезона
По номеру месяца определите сезон года.
### Задание 5: Guard clauses
Перепишите вложенные if используя guard clauses (ранний выход).
## Онлайн-редакторы
Тестируйте примеры:- **PHPSandbox**: https://phpsandbox.io/- **3v4l**: https://3v4l.org/
## Итоги
В этом уроке вы изучили:
✅ **if/else** — базовые условия✅ **elseif** — множественные проверки✅ **switch/case** — для точных совпадений✅ **match** — современная альтернатива (PHP 8+)✅ **Тернарный оператор** — краткая запись✅ **Логические операторы** — комбинирование условий✅ **Guard clauses** — ранний выход для читабельности
### Следующий шаг
Теперь изучим циклы для повторения кода: [Циклы](/php/loops/)
### Ключевые моменты
1. **Используйте ===** — строгое сравнение безопаснее2. **Guard clauses улучшают читабельность** — выходите рано3. **match лучше switch** — если у вас PHP 8+4. **Избегайте глубокой вложенности** — максимум 2-3 уровня5. **Тернарный оператор для простых случаев** — не вкладывайте глубоко
**Совет:** Условия — это логика вашей программы. Делайте код читабельным — будущий вы скажет спасибо!
---
**Готовы двигаться дальше?** Переходите к следующему уроку: [Циклы](/php/loops/)