Menu

Операторы PHP: арифметические, логические, строковые

Операторы PHP работают со значениями: +, -, *, /, %, ** для арифметики, =, +=, .=, ??= для присваивания, &&, ||, ! и xor для логики, . для склейки строк, ==, ===, <=> для сравнения и ++, -- для инкремента. Каждая группа на живых примерах и ловушка приоритета and против &&.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Оператор берёт одно или несколько значений и выдаёт новое: $a + $b складывает, $a . $b склеивает строки, $a && $b это логическое И, $a === $b сравнивает, $i++ увеличивает на единицу.

/ возвращает float, если только два целых не делятся нацело: 17 / 5 даёт 3.4, а 10 / 5 целое 2. Когда нужна только целая часть, используйте intdiv(). Округление описано на странице о математике.

Арифметические операторы

ОператорНазваниеПримерРезультат
+Сложение7 + 29
-Вычитание7 - 25
*Умножение7 * 214
/Деление7 / 23.5
%Остаток от деления7 % 21
**Возведение в степень7 ** 249
-$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, разницы нет.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ