Перейти к содержанию
Educora
Начальный17 мин3 / 10

Операторы, условия и циклы

Изучи арифметические операторы и операторы сравнения, разберись в разнице между == и === и в автоматическом приведении типов, научи программу принимать решения с помощью if, match и циклов.

Проверь себя
В этом уроке ты узнаешь
  • Использовать арифметические, логические операторы и операторы присваивания, а также ?? и ??=
  • Объяснять разницу между == и === и то, как работает приведение типов
  • Управлять ходом программы с помощью if/elseif/else, match, for и while

Интернет-магазин даёт скидку, когда сумма в корзине превышает 50 манатов, электронный журнал превращает баллы в оценки, а банк начисляет проценты, пока вклад не достигнет цели. Для всего этого программа должна считать, сравнивать и принимать решения. В этом уроке ты познакомишься с операторами, условиями и циклами PHP.

Арифметика и присваивание

PHP
<?php

$a = 17;
$b = 5;

echo $a + $b, "\n";
echo $a - $b, "\n";
echo $a * $b, "\n";
echo $a / $b, "\n";
echo $a % $b, "\n";
echo $a ** 2, "\n";
echo intdiv($a, $b), "\n";
var_dump(10 / 5);

$score = 10;
$score += 5;
$score *= 2;
$score++;
echo $score, "\n";
Ожидаемый результат
22
12
85
3.4
2
289
3
int(2)
31
  • / всегда делит точно: 17 / 5 даёт 3.4. Если деление нацело, результат — int: 10 / 5 → int(2). Чтобы получить только целую часть, используй intdiv.
  • % даёт остаток от деления, а ** возводит в степень.
  • +=, -=, *=, .= — составные операторы присваивания; $score++ увеличивает значение на 1.

Сравнение: == и ===

PHP при необходимости сам преобразует типы — это называется приведением типов (type juggling). Например, "5" + 3 даёт 8. Оператор == сравнивает значения после приведения типов, а === проверяет и значение, и тип. Соответственно есть и !=, и !==. Оператор <=> («космический корабль») возвращает -1, если левая часть меньше, 0 при равенстве и 1, если она больше.

PHP
<?php

var_dump(5 == "5");
var_dump(5 === "5");
var_dump(0 == "");
var_dump(null == false);
var_dump("1" == "01");
var_dump("abc" == 0);
var_dump(3 <=> 7);
Ожидаемый результат
bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)
int(-1)
Ошибка: `0 == false` истинно
$text = "PHP is fun";

if (strpos($text, "PHP") == false) {
    echo "Not found"; // printed by mistake!
}
Правильно (PHP 8)
$text = "PHP is fun";

if (!str_contains($text, "PHP")) {
    echo "Not found";
}
strpos находит слово на позиции 0 и возвращает 0, а 0 == false истинно. Либо пиши === false, либо используй функцию str_contains из PHP 8.

Логические операторы и ??

&& (и), || (или) и ! (не) объединяют условия. В условии ложью считаются false, 0, 0.0, "", "0", пустой массив [] и null, всё остальное — истина. Оператор объединения с null ?? возвращает левую часть, если она существует и не равна null, иначе — правую. А ??= присваивает значение, только если переменная равна null.

PHP
<?php

$age = 16;
$hasTicket = true;
echo ($age >= 16 && $hasTicket) ? "Welcome!\n" : "Sorry\n";

$nickname = null;
echo $nickname ?? "Guest", "\n";

$lang = null;
$lang ??= "az";
echo $lang, "\n";

var_dump((bool) "0");
var_dump((bool) "0.0");
Ожидаемый результат
Welcome!
Guest
az
bool(false)
bool(true)

if, elseif и match

PHP
<?php

$total = 72.5;

if ($total >= 100) {
    $discount = 15;
} elseif ($total >= 50) {
    $discount = 10;
} else {
    $discount = 0;
}

$toPay = $total - $total * $discount / 100;
echo "Discount: $discount%\n";
echo "To pay: " . number_format($toPay, 2) . " AZN\n";
Ожидаемый результат
Discount: 10%
To pay: 65.25 AZN

Выражение **match** из PHP 8 сравнивает одно значение с несколькими вариантами и возвращает результат. В отличие от switch, оно использует строгое сравнение ===, не требует break и принимает несколько значений в одной ветви. Если ни одна ветвь не подошла и нет default, выбрасывается ошибка UnhandledMatchError.

PHP
<?php

$day = 6;

$type = match ($day) {
    1, 2, 3, 4, 5 => "weekday",
    6, 7 => "weekend",
    default => "unknown",
};
echo "Day $day is a $type\n";

$score = 83;
$grade = match (true) {
    $score >= 90 => "A",
    $score >= 80 => "B",
    $score >= 70 => "C",
    default => "F",
};
echo "Score $score gives $grade\n";
Ожидаемый результат
Day 6 is a weekend
Score 83 gives B
Старый стиль: switch
switch ($status) {
    case 'new':
        $label = 'New order';
        break;
    case 'paid':
        $label = 'Paid';
        break;
    default:
        $label = 'Unknown';
}
Современно: match (PHP 8)
$label = match ($status) {
    'new' => 'New order',
    'paid' => 'Paid',
    default => 'Unknown',
};
match короче, забыть break невозможно, а результат сразу записывается в переменную.

Циклы: for и while

Цикл for удобен, когда число шагов известно заранее, а while повторяется, пока условие истинно. continue пропускает текущий шаг и переходит к следующему, а break полностью останавливает цикл. В примере ниже вклад растёт на 10 % в месяц, и мы считаем, за сколько месяцев он достигнет 150 манатов.

PHP
<?php

for ($i = 1; $i <= 5; $i++) {
    if ($i === 3) {
        continue;
    }
    echo "Step $i\n";
}

$balance = 100;
$months = 0;
while ($balance < 150) {
    $balance *= 1.1;
    $months++;
}
echo "Months: $months\n";
echo "Balance: " . round($balance, 2) . "\n";
Ожидаемый результат
Step 1
Step 2
Step 4
Step 5
Months: 5
Balance: 161.05

Главное

  • / делит точно, % даёт остаток, ** — степень, а intdiv — целую часть.
  • == приводит типы перед сравнением, а === проверяет и тип — по умолчанию пиши ===.
  • ?? подставляет значение по умолчанию вместо отсутствующего или null, а ??= записывает только в пустую переменную.
  • match сравнивает строго, возвращает значение и не требует break; match (true) удобен для диапазонов.
  • for — для повторений с известным числом шагов, while — для повторений по условию; continue пропускает шаг, break завершает цикл.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Что выведет var_dump(10 / 4);?