Перейти к содержимому

6. Условия

Условные операторы позволяют выполнять разный код в зависимости от условий. Это основа логики любой программы — возможность принимать решения.

  • Оператор if/else
  • Оператор elseif
  • Вложенные условия
  • Switch/case
  • Match expression (PHP 8+)
  • Тернарный оператор
  • Логические операторы в условиях

Выполняет код только если условие истинно.

<?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/else
if ($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 или match
if ($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_array
if (in_array($payment_method, ["card", "paypal", "crypto"])) {
echo "Онлайн оплата";
}
?>
```text
### NOT (!) — инверсия
```php
<?php
if (!$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
<?php
if (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/)