Операторы и выражения
Что такое операторы
Оператор — символ, выполняющий действие над значениями (операндами).
Выражение — комбинация операторов и операндов, дающая результат.
$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 включён';
}
Приоритет операторов
Основные (от высшего к низшему):
**!,++,--,(int),(string)*,/,%+,-,.<,>,<=,>===,!=,===,!==,<=>&&||???:=и его вариацииandor
Правило: если сомневаешься — ставь скобки.
Практика
<?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.