Операторы в PHP
Операторы - одна из важнейших и базовых тем. Почти все выражения так или иначе содержат их в себе. Без операторов в PHP не было бы возможности делать что-либо с данными вообще, так же, как, например, в математике. Поэтому отнеситесь к данной теме серьёзно, а в конце обязательно сделайте домашнее задание - только практика, только хардкор.
Но прежде чем перейти к изучению операторов, я предлагаю изучить функцию var_dump(). Она позволяет вывести тип и значение чего-либо.
Например, выражения:
<?php
var_dump(5/2);
Результат:
float 2.5
Или же переменной:
<?php
$result = 2 < 4;
var_dump($result);
Результат:
boolean true
2 меньше 4. Результат – истина. Всё верно.
Поздравляю, теперь мы в любой момент можем узнать, что находится в переменной, или же сразу узнать результат какого-либо выражения. Давайте теперь вернёмся к нашей основной теме урока.
Тема операторов очень плотно переплетается с темой типов данных. Как мы с вами уже говорили на прошлом уроке, тип данных, который получится в результате какого-либо выражения, будет зависеть от оператора. И, например, результатом сложения при использовании оператора плюса всегда будет число.
Приоритет операторов
Начнём с того, что операторы имеют разный приоритет. Как, например, в математике: оператор умножения будет более приоритетным по сравнению с оператором сложения:
<?php
$result = 2 + 2 * 2;
var_dump($result);
Результат:
int 6
Приоритетом можно управлять с помощью круглых скобок, например:
<?php
$result = (2 + 2) * 2;
var_dump($result);
Ну и тут думаю всё понятно:
int 8
В целом приоритеты операторов довольно предсказуемы.
Приоритет всех операторов в PHP можно посмотреть в официальной документации.
Типы операторов в PHP
А теперь давайте рассмотрим разные типы операторов
Арифметические операторы
Тут нас ждут знакомые со школьной скамьи операторы:
<?php
$a = 6;
$b = 3;
// Сложение
var_dump($a + $b);
// Вычитание
var_dump($a - $b);
// Умножение
var_dump($a * $b);
// Деление
var_dump($a / $b);
// Остаток от деления
var_dump($a % 4);
// Возведение в степень
var_dump($a ** 2);
Результат:
int 9
int 3
int 18
int 2
int 2
int 36
Многие впадают в ступор от оператора остатка от деления. Тут всё просто. В нашем случае мы вычисляем остаток от деления 6 на 4. Нацело не делится, целая часть – 1, и 2 в остатке. Ещё несколько аналогичных примеров для понимания:
<?php
var_dump(5 % 2);
var_dump(17 % 12);
var_dump(8 % 4);
Результат:
int 1
int 5
int 0
Думаю, арифметические операторы больше не требуют дополнительных разъяснений.
Оператор присваивания
С ним мы уже работали. Используется для присваивания какого-либо значения в переменную.
Классический пример:
<?php
$a = 55;
Ок, тут всё просто. А как на счёт такого:
<?php
$result = ($x = 5) * 2;
Здесь переменной $x присвоили значение 5, а затем умножили на 2 и положили результат выражения в переменную $result. Да, в PHP так тоже можно, хоть и не приветствуется, так как код выглядит довольно запутанно.
Помимо этого есть так называемые сокращенные, комбинированные операторы присваивания.
Например, в комбинации с оператором сложения:
<?php
$x = 5;
$y = 7;
$y += $x;
var_dump($y);
Результат:
int 12
Здесь
$y += $x
можно было бы записать как
$y = $y + $x
Таким образом, если что-то совершается с левым операндом в исходном виде, то можно использовать эти сокращённые варианты. И да, это применяется и выглядит весьма элегантно, стоит к ним привыкать уже сейчас. Давайте рассмотрим ещё несколько примеров:
<?php
$x = 6;
$y = 3;
$x /= $y;
var_dump($x);
Результат:
int 2
И с конкатенацией строк:
<?php
$hello = 'Hello ';
$hello .= 'world!';
var_dump($hello);
Результат:
string 'Hello world!' (length=12)
Ок, идём дальше.
Операторы сравнения
Ну тут из названия понятно, что это за операторы и для чего они предназначены. Результатом их работы всегда будет булево значение (true или false).
Начнём с операторов равенства/неравенства:
<?php
$x = 2;
$y = '2';
var_dump($x == $y); //проверка на равенство
var_dump($x === $y); //проверка на тождественное равенство
var_dump($x != $y); //проверка на неравенство
var_dump($x !== $y); //проверка на тождественное неравенство
Результат:
boolean true
boolean false
boolean false
boolean true
Давайте поясню. Оператор == приводит операнды к одному типу и после сравнивает их значения. Так строка '2' была преобразована к числу и значения оказались равными.
Оператор тождественного равенства === не выполняет приведения типов и сравнивает сначала то, что типы значений идентичны, например, целые числа, а затем сравнивает их значения. И если они одинаковы, то только в таком случае возвращает true.
Например:
<?php
$x = 2;
$y = 2;
var_dump($x === $y);
Результат:
boolean true
Оператор неравенства != приводит типы к одному и сравнивает значения. Если они не равны, вернёт true, иначе – false.
Оператор тождественного неравенства !== сначала сравнивает типы, если они не идентичны, например, строка и число, то вернёт true, иначе сравнит их значения. Если они не равны, вернёт true, иначе – false.
Также к операторам сравнения относятся:
<?php
$x = 2;
$y = 4;
var_dump($x > $y); // $x больше $y
var_dump($x < $y); // $x меньше $y
var_dump($x >= $y); // $x больше или равно $y
var_dump($x <= $y); // $x меньше или равно $y
Результат:
boolean false
boolean true
boolean false
boolean true
Тут всё очевидно, не будем задерживаться.
Spaceship
А теперь рассмотрим оператор сравнения, который появился в PHP7. Это спейсшип (или космический корабль) <=>. Похож на корабль штурмовиков из звёздных войн, не так ли?
Логика у этого оператора следующая:
$a <=> $b
Если $a > $b, вернёт 1
Если $a == $b, вернёт 0
Если $a < $b, вернёт -1
Давайте рассмотрим пример:
<?php
var_dump(2 <=> 4);
var_dump(2 <=> 2);
var_dump(5 <=> 3);
Результат:
int -1
int 0
int 1
Данный оператор был введён для использования в функциях сортировки. Эту тему мы пока поднимать не будем, просто знайте, что вот такой интересный оператор появился в последней версии PHP.
Инкремент и декремент
Зачастую в разных алгоритмах приходится увеличивать и уменьшать целые числа на единицу.
Для этого существуют специальные операторы инкремента и декремента.
Варианты могут быть самыми разными:
- $i++ - постфиксный инкремент, возвращает текущее значение $i, а затем увеличивает значение на единицу
- $i-- - постфиксный декремент, возвращает текущее значение $i, а затем уменьшает значение на единицу
- ++$i – префиксный инкремент, сначала увеличивает значение переменной $i на единицу, а затем возвращает результат
- --$i – префиксный декремент, сначала уменьшает значение переменной $i на единицу, а затем возвращает результат
Давайте рассмотрим несколько простых примеров:
<?php
$i = 5;
$x = $i++; // Сначала переменной $x присвоили текущее значение $i (5), затем $i увеличили на 1 (6)
$y = ++$i; // Сначала переменную $i увеличим на 1 (7), затем присвоили новое значение переменной $y (7)
$z = $i--; // Сначала $z присвоили значение $i (7), затем уменьшили $i на 1 (6)
var_dump($x);
var_dump($y);
var_dump($z);
var_dump($i);
Результат:
int 5
int 7
int 7
int 6
С инкрементом и декрементом на этом всё. Идём дальше.
Логические операторы
А теперь поговорим об одном из самых важных типов операторов, а именно – логических. Эти операторы используются для вычисления условий. Результатом такого оператора всегда будет истина или ложь. При этом операндами так же выступают истина или ложь.
Давайте перечислим их:
- && - логическое И, вернёт true, только если оба операнда истинны (true)
- || - логическое ИЛИ, вернёт true, если хотя бы один из операндов является истинным
- ! – ОТРИЦАНИЕ, возвращает true, если операнд – false, и наоборот. Применяется если нужно инвертировать условие, зачастую это очень кстати.
- xor – исключающее ИЛИ, вернёт true, только если один из операндов true, а другой – false
Давайте посмотрим на примере:
<?php
var_dump(true && true); // Результат: true
var_dump(true && false); // Результат: false
var_dump(true || true); // Результат: true
var_dump(true || false); // Результат: true
var_dump(false || true); // Результат: true
var_dump(!true); // Результат: false
var_dump(!false); // Результат: true
var_dump(false xor true); // Результат: true
var_dump(true xor true); // Результат: false
var_dump(true xor false); // Результат: true
var_dump(false xor false); // Результат: false
А теперь давайте более интересно – определим, является ли число чётным и при этом оно больше 10. Для того, чтобы проверить на чётность – достаточно взять остаток от деления на 2 и сравнить с нулём. Если будет 0, то число чётное. Давайте напишем первое вычисление:
<?php
$x = 14;
$isEven = $x % 2 == 0;
var_dump($isEven); // true
А теперь второе:
<?php
$x = 14;
$isEven = $x % 2 == 0;
var_dump($isEven); // true
$isMoreThan10 = $x > 10;
var_dump($isMoreThan10); // true
Остаётся сделать так, чтобы выполнились оба условия. Воспользуемся логическим И:
<?php
$x = 14;
$isEven = $x % 2 == 0;
var_dump($isEven);
$isMoreThan10 = $x > 10;
var_dump($isMoreThan10);
$isEvenAndMoreThan10 = $isEven && $isMoreThan10;
var_dump($isEvenAndMoreThan10);
Вычисление можно было бы выразить и одной строкой:
<?php
$x = 14;
$isEvenAndMoreThan10 = $x % 2 == 0 && $x > 10;
Однако, согласитесь, первый вариант разбит по пунктам и более понятен. Я хочу, чтобы Вы поняли. Ваш код не должен занимать как можно меньше места. Он должен быть понятен. Можно сказать, будет очень неплохо, если он будет скучен. Он должен легко читаться программистами. В первом случае всё очевидно: выяснили, что число чётное, что оно больше 10, и решили, что оба эти условия выполняются одновременно. Вот как-то так должен мыслить человек, читающий Ваш код.
И ещё, если операнды не являются булевыми значениями, они будут автоматически приведены к true или false. Оставим это на самостоятельное ковыряние – в домашнем задании будет пункт, касательно этого замечания. Обязательно выполните его.
Строковый оператор конкатенации
Да-да, для строк существует только один оператор – для их объединения в одну: оператор конкатенации. Он представляет из себя точку и его использование выглядит следующим образом:
<?php
$string1 = 'Привет';
$string2 = 'мир!';
echo $string1 . ', ' . $string2;
Результат:
Привет, мир!
На этом заканчивается наш урок по операторам. Обязательно выполните домашку, без неё дальше не пойдёт.
Комментарии