Урок 04

Операторы и выражения

Что такое операторы

Оператор — символ, выполняющий действие над значениями (операндами).

Выражение — комбинация операторов и операндов, дающая результат.

$a = 5 + 3;   // 5 + 3 — выражение, $a — переменная, = — оператор

Арифметические

$a = 10;
$b = 3;

echo $a + $b;   // 13
еcho $a - $b;   // 7
echo $a * $b;   // 30
echo $a / $b;   // 3.3333...
echo $a % $b;   // 1 (остаток)
echo $a ** $b;  // 1000 (10 в степени 3)

Деление: в PHP / всегда возвращает float, если результат не целый.

intdiv() — целочисленное деление:

intdiv(10, 3);   // 3

fmod() — остаток для дробных:

fmod(10.5, 3);   // 1.5

Присваивание

$a = 5;       // простое
$a += 3;      // $a = $a + 3
$a -= 2;      // $a = $a - 2
$a *= 4;      // $a = $a * 4
$a /= 2;      // $a = $a / 2
$a %= 5;      // $a = $a % 5
$a **= 2;     // $a = $a ** 2

Конкатенация:

$str = 'Hello';
$str .= ' world';   // 'Hello world'

Инкремент и декремент

$i = 5;

$i++;    // $i = 6 (пост-инкремент: сначала значение, потом +1)
++$i;    // $i = 7 (пре-инкремент: сначала +1, потом значение)
$i--;    // $i = 6
--$i;    // $i = 5

Разница в выражениях:

$a = 5;
$b = $a++;   // $b = 5, $a = 6

$a = 5;
$b = ++$a;   // $b = 6, $a = 6

Сравнение

$a == $b;    // равно (с приведением типов)
$a === $b;   // идентично (тип и значение)
$a != $b;    // не равно
$a !== $b;   // не идентично
$a < $b;     // меньше
$a > $b;     // больше
$a <= $b;    // меньше или равно
$a >= $b;    // больше или равно

⚠️ == vs ===:

'5' == 5;     // true (приводит к числу)
'5' === 5;    // false (разные типы)

0 == 'abc';   // PHP 8: false (раньше было true!)
0 === 'abc';  // false

null == false; // true
null === false; // false

Правило: всегда используй === и !==.

Spaceship operator

<=> — возвращает -1, 0, 1:

1 <=> 2;    // -1
2 <=> 2;    // 0
3 <=> 2;    // 1

Для сортировки:

$arr = [3, 1, 2];
usort($arr, fn($a, $b) => $a <=> $b);
// [1, 2, 3]

Логические

$a && $b;   // И (оба true)
$a || $b;   // ИЛИ (хотя бы один true)
!$a;        // НЕ
$a and $b;  // И (низкий приоритет)
$a or $b;   // ИЛИ (низкий приоритет)
$a xor $b;  // исключающее ИЛИ

Приоритет:

// && и || выше, чем and/or
$a = true and false;   // $a = true! (потому что = выполнилось раньше)
$a = (true and false); // $a = false
$a = true && false;    // $a = false

Правило: используй &&, || — понятнее.

Короткое замыкание

// Если $a false — $b не вычисляется
if ($a && $b) { ... }

// Если $a true — $b не вычисляется
if ($a || $b) { ... }

Практика:

$user = getUser();
if ($user && $user->isActive()) {
    // безопасно: если $user null, второй вызов не сработает
}

Строковые операторы

Конкатенация .:

$full = 'Иван' . ' ' . 'Иванов';   // 'Иван Иванов'
$count = 'Всего: ' . 5;            // 'Всего: 5'

Присваивание с конкатенацией .=:

$msg = 'Привет';
$msg .= ', мир';   // 'Привет, мир'

Тернарный оператор

$status = $age >= 18 ? 'взрослый' : 'ребёнок';

Вложенный (плохо):

$result = $a ? $b : ($c ? $d : $e);

PHP 8: вложенные тернарники без скобок запрещены.

Сокращённый (Elvis):

$name = $user['name'] ?: 'Гость';
// если $user['name'] — truthy, вернёт его, иначе 'Гость'

Null coalescing

?? — если значение null или не существует:

$name = $_GET['name'] ?? 'Гость';

Цепочка:

$city = $user['address']['city'] ?? 'не указан';

Присваивание:

$count ??= 0;   // если $count null — присвоить 0

Разница с ?::

$a = 0;
$b = $a ?: 5;    // 5 (0 — falsy)
$c = $a ?? 5;    // 0 (не null)

Nullsafe оператор

?-> (PHP 8+):

$city = $user?->address?->city;

Что делает: если $user null, вернёт null, не вызовет ошибку.

Без него:

$city = $user !== null && $user->address !== null
    ? $user->address->city
    : null;

Оператор подавления ошибок

@ — глушит ошибки:

$content = @file_get_contents('/nonexistent');

⚠️ Не используй — скрывает реальные баги. Используй try/catch или проверки.

Битовая арифметика

$a & $b;    // AND
$a | $b;    // OR
$a ^ $b;    // XOR
~$a;        // NOT
$a << 2;    // сдвиг влево
$a >> 2;    // сдвиг вправо

Пример — флаги:

const FLAG_A = 1;      // 001
const FLAG_B = 2;      // 010
const FLAG_C = 4;      // 100

$flags = FLAG_A | FLAG_C;   // 101 = 5

if ($flags & FLAG_A) {
    echo 'A включён';
}

Приоритет операторов

Основные (от высшего к низшему):

  1. **
  2. !, ++, --, (int), (string)
  3. *, /, %
  4. +, -, .
  5. <, >, <=, >=
  6. ==, !=, ===, !==, <=>
  7. &&
  8. ||
  9. ??
  10. ?:
  11. = и его вариации
  12. and
  13. or

Правило: если сомневаешься — ставь скобки.

Практика

<?php

declare(strict_types=1);

$price = 1000;
$discount = 15;
$hasPromoCode = true;
$isFirstOrder = false;

$extraDiscount = $hasPromoCode && $isFirstOrder ? 10 : 0;
$totalDiscount = $discount + $extraDiscount;
$finalPrice = $price - ($price * $totalDiscount / 100);

echo "Итоговая цена: {$finalPrice} руб.";

Итог

  • Арифметика: + - * / % **.
  • Сравнение: всегда === и !==.
  • Логика: &&, ||, !.
  • Тернарник: ?: для простых условий.
  • ?? — для null-значений.
  • ?-> — nullsafe.
  • Скобки — друг.

Дальше — условия: if, else, switch.