Чат Telegram
Группа ВКонтакте
Изучаем операторы в PHP: теория и практика

Операторы в 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;

Результат:

Привет, мир!

На этом заканчивается наш урок по операторам. Обязательно выполните домашку, без неё дальше не пойдёт.

Присоединяйтесь к нам в ВКонтакте и в Facebook, чтобы не пропустить новые уроки. А также вступайте в наш чат PHP-разработчиков в Telegram.
Домашнее задание
  • Самостоятельно изучите официальную документацию на тему приоритетов операторов.
  • С помощью функции var_dump() получите результаты следующих выражений. Если что-то непонятно - спрашивайте в комментариях.
  • !1
  • !0
  • !true
  • 2 && 3
  • 5 && 0
  • 3 || 0
  • 5 / 1
  • 1 / 5
  • 5 + '5string'
  • '5' == 5
  • '05' == 5
  • '05' == '5'
Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Комментарии (56)
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
loader
Есть вопрос по программированию?
Здесь быстро ответят!
Задать вопрос
Курс программирования на PHP
Подготовка до уровня устройства на работу!
Начать бесплатно
loader
Форум веб-разработчиков
Здесь все!
Перейти
loader
Логические задачи с собеседований