В PHP мы можем использовать различные операторы: арифметические, логические и т.д. Рассмотрим каждый тип операций.
+ (операция сложения)
Например,$a + 5
- (операция вычитания)
Например,$a - 5
* (умножение)
Например,$a * 5
/ (деление)
Например,$a / 5
% (получение остатка от деления)
Например:$a = 12; echo $a % 5; // равно 2
** (возведение в степень)
Например,$a ** 2
Примеры операций:
$a = 8 + 2; // 10, сложение $a = 8 - 2; // 6, вычитание $a = 8 * 2; // 16, умножение $a = 8 / 2; // 4, деление $a = 8 % 2; // 0, деление по модулю $a = 8 ** 2; // 64, возведение в степень
Отдельно следует сказать операции инкремента и декремента, которые также являются арифметическими операциями, но производятся над одним операндом.
Инкремент - операция ++ увеличивает число на единицу. Например, ++$a
Есть два типа инкремента: префиксный инкремент (++$a
) и постфиксный ($a++
). Важно понимать разницу между этими операциями.
Рассмотрим сначала префиксный инкремент:
$a = 12; $b = ++$a; // $b равно 13 echo "a = $a b = $b";
Результат работы:
a = 13 b = 13
Здесь сначала к значению переменной $a прибавляется единица, а затем ее значение приравнивается переменной $b.
Теперь посмотрим, что будет в случае с постфиксным инкрементом:
$a = 12; $b = $a++; // $b равно 12 echo "a = $a b = $b";
Результат работы:
a = 13 b = 12
Здесь сначала значение переменной $a передается переменной $b, а затем происходило увеличение значения переменной $a.
Декремент - операция -- представляет уменьшение значения на единицу. Она аналогично инкременту бывает префиксной и постфиксной и работает аналогично. Например, префиксный декремент:
$a = 12; $b = --$a; // $b равно 11 echo "a = $a b = $b";
Результат работы:
a = 11 b = 11
Сначала значение переменной $a уменьшается на единицу, а затем ее значение приравнивается переменной $b.
Постфиксный декрементом:
$a = 12; $b = $a--; // $b равно 12 echo "a = $a b = $b";
Результат работы:
a = 11 b = 12
Здесь же сначала значение переменной $a передается переменной $b и только после этого уменьшается на единицу.
Для объединения строк используется оператор "точка". Например, соединим несколько строк:
$a="Привет, "; $b=" мир"; echo $a . " " . $b . "!"; // Привет мир!
Если переменные представляют не строки, а другие типы, например, числа, то их значения преобразуются в строки и затем также происходит операция объединения строк.
Операции сравнения, как правило, применяются в условных конструкциях, когда надо сравнивать два значения, и в зависимости от результата сравнения выполнить некоторые действия. Имеются следующие операции сравнения.
==
Оператор равенства сравнивает два значения, и если они равны, возвращает true, иначе возвращает false:$a == 5
===
Оператор тождественности также сравнивает два значения, и если они равны, возвращает true, иначе возвращает false:$a === 5
!=
Сравнивает два значения, и если они не равны, возвращает true, иначе возвращает false:$a != 5
!==
Сравнивает два значения, и если они не равны, возвращает true, иначе возвращает false:$a !== 5
>
Сравнивает два значения, и если первое больше второго, то возвращает true, иначе возвращает false:$a > 5
<
Сравнивает два значения, и если первое меньше второго, то возвращает true, иначе возвращает false:$a < 5
>=
Сравнивает два значения, и если первое больше или равно второму, то возвращает true, иначе возвращает false:$a >= 5
<=
Сравнивает два значения, и если первое меньше или равно второму, то возвращает true, иначе возвращает false:$a <= 5
Оба оператора сравнивают два выражения и возвращают true, если выражения равны. Но между ними есть различия. Если в операции равенства принимают два значения разных типов, то они приводятся к одному - тому, который интерпретатор найдет оптимальным. Например:
$a = (2 == "2"); // true (значения равны) $b = (2 === "2"); // false (значения представляют разные типы)
Строка "2" по сути представляет то же значение, что и число 2, оператор сравнения возвратит true
. Однако они представляют разные типы,
поэтому оператор тождественности возвратит false
Аналогично работают операторы неравенства !=
и !==
.
$a = (2 != "2"); // false, так как значения равны $b = (2 !== "2"); // true, так как значения представляют разные типы
Отдельно стоит сказать про оператор <=>. Он также сравнивает два значения и возвращает
0, если оба значения равны
1, если значение слева больше, чем значение справа
–1, если значение слева меньше, чем значение справа
Применение:
$a = 2 <=> 2; // 0 (эквивалентно 2 == 2) $b = 3 <=> 2; // 1 (эквивалентно 3 > 2) $c = 1 <=> 2; // -1 (эквивалентно 1 < 2) echo "a=$a b=$b c=$c"; // a=0 b=1 c=-1
Логические операции обычно применяются для объединения результатов двух операций сравнения. Например, нам надо выполнить определенное действие, если истинны будут несколько условий. Имеются следующие логические операции:
&&
Возвращает true, если обе операции сравнения возвращают true, иначе возвращает false:$a && $b
and
Аналогично операции&&
: $a and $b
||
Возвращает true, если хотя бы одна операция сравнения возвращают true, иначе возвращает false:$a || $b
or
Аналогично операции||
: $a or $b
!
Возвращает true, если операция сравнения возвращает false:!$a
xor
Возвращает true, если только одно из значений равно true. Если оба равны true или ни одно из них не равно true, возвращает false:$a xor $b
Примеры логических операций:
$a = (true && false); // false // аналогично $a = (true and false); // false $b = (true || false); // true // аналогично следующей операции $b = (true or false); // true $c = !true; // false
Отдельно примеры с операцией xor
:
$a = (true xor true); // false $b = (false xor true); // true $c = (false xor false); // false
Поразрядные операции производятся над отдельными разрядными или битами числа. Числа рассматриваются в двоичном представлении, например, 2 в двоичном представлении 010, число 7 - 111.
& (логическое умножение)
Умножение производится поразрядно, и если у обоих операндов значения разрядов равно 1, то операция возвращает 1, иначе возвращается число 0. Например:$a = 4; //100 $b = 5; //101 echo $a & $b; // равно 4 - 100
Здесь число 4 в двоичной системе равно 100, а число 5 равно 101. Поразрядно умножим числа и получим (1*1, 0*0, 0 *1) = 100, то есть число 4 в десятичном формате.
| (логическое сложение)
Похоже на логическое умножение, операция также производится по двоичным разрядам, но теперь возвращается единица, если хотя бы у одного числа в данном разряде имеется единица. Например:$a = 4; //100 $b = 5; //101 echo $a | $b; // равно 5 - 101
Поразрядно сложим числа и получим (1+1, 0+0, 0+1) = 101, то есть число 5 в десятичном формате.
^ (операция исключающего ИЛИ)
Возвращает единицу, если у обоих операндов разные значения соответствующих разрядов. Но если у обоих операндов значения соответствующих разрядов совпадают, то возвращается 0. Например:$a = 5 ^ 4; // 101^100=001 - в десятичой системе 1 $b = 7 ^ 4; // 111^100=011 - в десятичой системе 3
Поразрядно произведем операцию 5 ^ 4
(в двоичной системе она аналогична операции 101^100
): (1^1, 0^0, 0^1) = 001.
В случае с 1^1
значения разрядов совпадают, поэтому возвращается 0. Во втором случае - 0^0
значения также совпадают, поэтому также возвращается
0. В третьем случае - 0^1
значения разные, поэтому возвращается 1. В итоге получится 001 или число 1 в десятичной системе.
~ (логическое отрицание)
инвертирует все разряды: если значение разряда равно 1, то оно становится равным нулю, и наоборот.$a = 4; //00000100 $b = ~$a; //11111011 -5 echo $b; // равно -5
<<
x<<y - сдвигает число x влево на y разрядов. Например, 4<<1 сдвигает число 4 (которое в двоичном представлении 100) на один разряд влево, то есть в итоге получается 1000 или число 8 в десятичном представлении
>>
x>>y - сдвигает число x вправо на y разрядов. Например, 16>>1 сдвигает число 16 (которое в двоичном представлении 10000) на один разряд вправо, то есть в итоге получается 1000 или число 8 в десятичном представлении
=
Приравнивает переменной определенное значение:$a = 5
+=
Сложение с последующим присвоением результата. Например:$a=12; $a += 5; echo $a; // равно 17
-=
Вычитание с последующим присвоением результата. Например:$a=12; $a -= 5; echo $a; // равно 7
*=
Умножение с последующим присвоением результата:$a=12; $a *= 5; echo $a; // равно 60
/=
Деление с последующим присвоением результата:$a=12; $a /= 5; echo $a; // равно 2.4
.=
Объединение строк с присвоением результата. Применяется к двум строкам. Если же переменные хранят не строки, а, к примеру, числа, то их значения преобразуются в строки и затем проводится операция:$a=12; $a .= 5; echo $a; // равно 125 // идентично $b="12"; $b .="5"; // равно 125
%=
Получение остатка от деления с последующим присвоением результата:$a=12; $a %= 5; echo $a; // равно 2
**=
Получение результата от возведения в степень:$a=8; $a **= 2; echo $a; // равно 64 (8 в степени 2)
&=
Получение результата от операции логического умножения:$a=5; $a &= 4; // 101&100=100 - 4
|=
Получение результата от операции логического сложения:$a=5; $a |= 4; // 101|100=101 - 5
^=
Получение результата от операции исключающего ИЛИ:$a=5; $a ^= 4; // 101^100=001 - 1
<<=
Получение результата от операции сдвига влево:$a=8; $a <<= 1; // 1000 << 1 = 10000 - 16
>>=
Получение результата от операции сдвига вправо:$a=8; $a >>= 1; // 1000 >> 1 = 100 - 4
Если одно выражение содержит несколько разных операций, то при выполнении выражения учитывается приоритет операций. Сначала выполняются операции с большим приоритетом и в конце с меньшим приоритетом.
Приоритет операций можно описать следующей таблицей:
** |
++ -- ~ |
! |
* / % |
+ - . |
<< >> |
< > <= >= |
== != === !== << <=< |
& |
^ |
| |
&& |
|| |
? : (тернарный оператор) |
= += -= *= **= /= .= %= &= |= ^= <<= >>= (операторы присваивания) |
and |
xor |
or |
Чем выше оператор в этой таблице, тем больше его приоритет. Например:
$a = 10 + 5 * 2; // 20
Операция умножения имеет больший приоритет, чем сложение. Поэтому сначала выполняется подвыражение 5 * 2
При этом скобки повышают приоритет операции, используемой в выражении.
$a = (10 + 5) * 2; // 30
В данном случае сначала выполняется подвыражение 10 + 5
и только потом умножение.