Операции в PHP
В PHP мы можем использовать различные операторы: арифметические, логические и т.д. Рассмотрим каждый тип операций.
Арифметические операции
+
(операция сложения)-
(операция вычитания)*
(умножение)/
(деление)%
(получение остатка от деления)**
(возведение в степень)
$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 = 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
===
оператор тождественности также сравнивает два значения, и если они равны, возвращаетtrue
, иначе возвращаетfalse
-
!=
сравнивает два значения, и если они не равны, возвращаетtrue
, иначе возвращаетfalse
-
!==
сравнивает два значения, и если они не равны, возвращаетtrue
, иначе возвращаетfalse
>
сравнивает два значения, и если первое больше второго, то возвращаетtrue
, иначе возвращаетfalse
<
сравнивает два значения, и если первое меньше второго, то возвращаетtrue
, иначе возвращаетfalse
>=
сравнивает два значения, и если первое больше или равно второму, то возвращаетtrue
, иначе возвращаетfalse
<=
сравнивает два значения, и если первое меньше или равно второму, то возвращаетtrue
, иначе возвращаетfalse
Оператор равенства и тождественности
Оба оператора сравнивают два выражения и возвращают 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
and
Аналогично операции&&
||
Возвращаетtrue
, если хотя бы одна операция сравнения возвращают true, иначе возвращаетfalse
or
Аналогично операции||
!
Возвращаетtrue
, если операция сравнения возвращаетfalse
xor
Возвращаетtrue
, если только одно из значений равноtrue
. Если оба равныtrue
или ни одно из них не равноtrue
, возвращаетfalse
Примеры логических операций:
$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
и только потом умножение.