- Использовать арифметические, логические операторы и операторы присваивания, а также
??и??= - Объяснять разницу между
==и===и то, как работает приведение типов - Управлять ходом программы с помощью
if/elseif/else,match,forиwhile
Интернет-магазин даёт скидку, когда сумма в корзине превышает 50 манатов, электронный журнал превращает баллы в оценки, а банк начисляет проценты, пока вклад не достигнет цели. Для всего этого программа должна считать, сравнивать и принимать решения. В этом уроке ты познакомишься с операторами, условиями и циклами 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
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)
$text = "PHP is fun";
if (strpos($text, "PHP") == false) {
echo "Not found"; // printed by mistake!
}$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
$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
$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
$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 ($status) {
case 'new':
$label = 'New order';
break;
case 'paid':
$label = 'Paid';
break;
default:
$label = 'Unknown';
}$label = match ($status) {
'new' => 'New order',
'paid' => 'Paid',
default => 'Unknown',
};match короче, забыть break невозможно, а результат сразу записывается в переменную.Циклы: for и while
Цикл for удобен, когда число шагов известно заранее, а while повторяется, пока условие истинно. continue пропускает текущий шаг и переходит к следующему, а break полностью останавливает цикл. В примере ниже вклад растёт на 10 % в месяц, и мы считаем, за сколько месяцев он достигнет 150 манатов.
<?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.
var_dump(10 / 4);?