Оператор берёт одно или несколько значений и выдаёт новое: $a + $b складывает, $a . $b склеивает строки, $a && $b это логическое И, $a === $b сравнивает, $i++ увеличивает на единицу.
/ возвращает float, если только два целых не делятся нацело: 17 / 5 даёт 3.4, а 10 / 5 целое 2. Когда нужна только целая часть, используйте intdiv(). Округление описано на странице о математике.
Арифметические операторы
| Оператор | Название | Пример | Результат |
|---|---|---|---|
+ | Сложение | 7 + 2 | 9 |
- | Вычитание | 7 - 2 | 5 |
* | Умножение | 7 * 2 | 14 |
/ | Деление | 7 / 2 | 3.5 |
% | Остаток от деления | 7 % 2 | 1 |
** | Возведение в степень | 7 ** 2 | 49 |
-$a | Смена знака | -7 | -7 |
Остаток от деления удобен для задач "каждый N-й элемент" и проверки на чётность. Результат получает знак левой части, а деление на ноль выбрасывает ошибку, которую можно перехватить:
Операторы присваивания
= сохраняет значение. У каждого арифметического и строкового оператора есть составная форма, которая обновляет переменную на месте.
??= относится к семейству оператора объединения с null. Он присваивает значение, только если переменная не задана или равна null.
Инкремент и декремент: ++ и --
$i++ возвращает текущее значение, а потом прибавляет 1. ++$i прибавляет 1, а потом возвращает новое значение. Разница видна, только когда результат используется в том же выражении.
С помощью трюка с буквами часто генерируют имена столбцов электронных таблиц (A, B, ... Z, AA).
Логические операторы: &&, ||, ! и xor
| Оператор | Истинно, когда |
|---|---|
$a && $b | оба истинны |
$a || $b | хотя бы один истинен |
!$a | $a ложно |
$a xor $b | истинен ровно один |
$a and $b, $a or $b | то же, что && и ||, но с меньшим приоритетом |
&& и || вычисляются по короткой схеме: правая часть не вычисляется, если левая уже определила результат. Именно поэтому isset($user) && $user->isAdmin() безопасно.
and и &&: ловушка приоритета
and и or связывают слабее, чем =, поэтому в присваивании они применяются уже после сохранения значения. Это классическая ошибка:
Низкий приоритет полезен в одной идиоме, $file = fopen($path, 'r') or die('Cannot open');, где присваивание должно произойти первым. Везде в остальных местах используйте && и ||.
Строковые операторы: . и .=
В PHP два строковых оператора: . склеивает две строки ("Grace" . " " . "Hopper"), а .= дописывает к переменной ($html .= "<li>"). + никогда не склеивает строки: "3" + "4" это число 7, а "3" . "4" строка "34". Интерполяция и кавычки описаны на странице про строки.
Сравнение и оператор spaceship <=>
== сравнивает после приведения типов, === проверяет ещё и тип, а <=> возвращает -1, 0 или 1, ровно то, что нужно функциям сортировки. Подробности и полная таблица нестрогого сравнения на странице об операторах сравнения.
Операторы для массивов
+ для массивов это объединение: ключи левого массива побеждают, а из правого добавляются только недостающие ключи. Это удивляет тех, кто ждёт добавления в конец. == проверяет одинаковые пары ключ/значение, === требует ещё и того же порядка и типов.
Чтобы добавить один список в конец другого, используйте array_merge() или распаковку [...$a, ...$b].
Приоритет операторов
Когда в выражении смешаны операторы, PHP применяет их в фиксированном порядке. Вот те, на которых чаще всего спотыкаются, с тем, что печатает PHP 8.3:
echo 2 + 3 * 4; // 14: * before +
echo (2 + 3) * 4; // 20
echo 2 ** 3 ** 2; // 512: right to left, 2 ** 9
echo -2 ** 2; // -4: ** before unary minus
echo "Sum: " . 2 + 3; // Sum: 5, since PHP 8 + runs before .
Если сомневаетесь, ставьте скобки. Они ничего не стоят, и следующему читателю не придётся вспоминать таблицу.
Часто задаваемые вопросы
Чем and отличается от && в PHP?
Оба означают логическое И, но у and приоритет ниже, чем у =. Поэтому $x = true and false; сохраняет в $x значение true (сначала выполняется присваивание), а $x = true && false; сохраняет false. В выражениях используйте && и ||, а and/or не ставьте в присваивания.
Что делает % в PHP?
% это оператор остатка от деления: он возвращает остаток целочисленного деления, поэтому 10 % 3 равно 1. Результат получает знак левого операнда (-7 % 3 равно -1). Для float используйте fmod(), а % 0 выбрасывает DivisionByZeroError.
Как возвести число в степень в PHP?
Используйте оператор **: 2 ** 10 равно 1024. Он правоассоциативен, поэтому 2 ** 3 ** 2 это 2 ** 9 = 512, и связывает сильнее унарного минуса, поэтому -2 ** 2 равно -4. Функция pow(2, 10) делает то же самое.
Чем $i++ отличается от ++$i в PHP?
Оба прибавляют 1 к $i. $i++ (постинкремент) возвращает старое значение и потом увеличивает; ++$i (преинкремент) сначала увеличивает и возвращает новое значение. В отдельной строке, например на шаге цикла for, разницы нет.