Изучаем операторы в 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;

Результат:

Привет, мир!

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

Присоединяйтесь к нам в Twitter, ВКонтакте, Facebook и Google+, а также вступайте в наш чат в Telegram, чтобы не пропустить новые уроки и быть в курсе последних новостей из мира веб-разработки.
Домашнее задание
  • Самостоятельно изучите официальную документацию на тему приоритетов операторов.
  • С помощью функции var_dump() получите результаты следующих выражений. Если что-то непонятно - спрашивайте в комментариях.
  • !1
  • !0
  • !true
  • 2 && 3
  • 5 && 0
  • 3 || 0
  • 5 / 1
  • 1 / 5
  • 5 + '5string'
  • '5' == 5
  • '05' == 5
  • '05' == '5'
Читайте также
Комментарии


omk
omk

Почему '05' == '5' true?
По идее оператору == не надо переводить в int, а сравнить 2 string. Но тогда строка '05' не равна строке '5'.

ivashkevich
ivashkevich

Правильный вопрос! Ответ имеется в официальной документации, вот тут.

omk
omk

Я немного не то имел ввиду, но ответ нашёл. Оказывается при сравнения типа string, стоки всегда переводятся в числа, а потом сравниваются. Тут

Daniil
Daniil

У меня другое отображение:

<?php
$hello = 'Hello ';
$hello .= 'world!';
var_dump($hello);

Результат:

string(12) "Hello world!"
kertsad@gmail.com
kertsad@gmail.com

Ты же зпросил не вывод а свойства строки. Вот он и выдал: это строка с 12 символами. Этими символами являются hello world! Чтобы запросить просто вывод пропиши echo $hello, тогда он выведет только то, что написано в строке.

Generalisimus
Generalisimus
<?php
$a=5;
$b=$a!=true;
$c=$a!=0;
$d=$a!=true;
$e=$a=2&&3;
$f=$a=5&&0;
$j=$a=3||0;
$h=$a=5/1;
$k=$a=1/5;
$l=$a="5 + '5string'";
$m=$a='5'==5;
$n=$a='05'==5;
$o=$a='05'=='5';
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
var_dump($e);
var_dump($f);
var_dump($j);
var_dump($h);
var_dump($k);
var_dump($l);
var_dump($m);
var_dump($n);
var_dump($o);

?>

//Только не пропобал поставить <br/>или \n или \r не получилось

Generalisimus
Generalisimus

результат

bool(true) 
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
int(5)
float(0.2)
string(13) "5 + '5string'" 
bool(true)
bool(true)
bool(true)
Generalisimus
Generalisimus

и еще сам себе рейтинг поставил -1)))жалко нельзя редактировать коммент

ivashkevich
ivashkevich

Спасибо за обратную связь, добавил возможность редактировать комментарии. И оформляйте код с помощью markdown-разметки.

vasyaproject
vasyaproject

Честно говоря, не очень понял, че надо сделать в ДЗ, хорошо бы, если ответы были бы на какой-нибудь странице, чтобы сверить. Что значит получить !1 ? Такой что ли:

$x = !1;
var_dump($x);
ответ bool(false)
ivashkevich
ivashkevich

Доброго времени суток.
Вы все правильно поняли, просто посмотрите чему будут равны значения в той или иной ситувции. Не нужны вам на данном этапе никакие ответы, все у вас прекрасно получается =)

vasyaproject
vasyaproject

ок, спасибо

Tays
Tays

Здравствуйте.
5 + '5string'; - Notice: A non well formed numeric value encountered
Почему нужно обязательно брать кавычки?

ivashkevich
ivashkevich

Здравствуйте. Потому что это строка. А PHP Вас в свою очередь уведомил, что вы складываете строку с числом, что вообще говоря неверно.

serb2017
serb2017

!1 is bool(false)
!0 is bool(true)
2 && 3 is bool(true)
5 && 0 is bool(false)
3 || 0 is bool(true)
5 / 1 is int(5)
1 / 5 is float(0.2)
5 + '5string' is int(10)
'5' == 5 is bool(true)
'05' == 5 is bool(true)
'05' == '5' is bool(true)

markEvillive
markEvillive

Код

<?php
var_dump(!1);//Очевидно, так как 1 это true - bool(false))
echo '<br>';
var_dump(!0);//0 воспринимается как false - bool(true)
echo '<br>';
var_dump(!true);//Очевидно, обратное значение true это false - bool(false))
echo '<br>';
var_dump(2 && 3);//Оба значения не false - bool(true)
echo '<br>';
var_dump(5 && 0);//Второе значение 0 - bool(false)
echo '<br>';
var_dump(3 || 0);//Хотя бы один из операндов (3) true - bool(true)
echo '<br>';
var_dump(5 / 1);//Деление дает целое число - int(5)
echo '<br>';
var_dump(1 / 5);//Деление дает дробное число - float(0,2)
echo '<br>';
var_dump(5 + '5string');//Если строка начинается с верного числового значения, будет использовано это значение  - int(10)
echo '<br>';
var_dump('5' == 5);//Во всех трех следующих случаях работает преобразование строк в числа - bool(true)
echo '<br>';
var_dump('05' == 5);// bool(true)
echo '<br>';
var_dump('05' == '5');//bool(true)
echo '<br>';
?>

Результат

bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
int(5)
float(0.2)
int(10)
bool(true)
bool(true)
bool(true)

P.S: Некоторые трудности возникли с пониманием того, как работает префиксный инкремент и декремент.

ivashkevich
ivashkevich

Трудности ещё остались?

markEvillive
markEvillive

Нет, попробовал покопаться в инкрементах/декрементах самостоятельно, и понял.

ivashkevich
ivashkevich

Отлично!)

Koala
Koala

Решение

    echo 'ДЗ <br>';
    var_dump(!1);
    echo '<br>';
    var_dump(!0);
    echo '<br>';
    var_dump(!true);
    echo '<br>';
    var_dump(2 && 3);
    echo '<br>';
    var_dump(5 && 0);
    echo '<br>';
    var_dump(3 || 0);
    echo '<br>';
    var_dump(5 / 1);
    echo '<br>';
    var_dump(1 / 5 );
    echo '<br>';
    var_dump(5 + '5string');
    echo '<br>';
    var_dump('5' == 5);
    echo '<br>';
    var_dump('05' == 5);
    echo '<br>';
    var_dump('05' == '5');

Результат

ДЗ 
bool(false) 
bool(true) 
bool(false) 
bool(true) 
bool(false) 
bool(true) 
int(5) 
float(0.2) 

Notice: A non well formed numeric value encountered in C:\Users\Администратор\Documents\WSK\Git\HowToMakeSites-PHP-\1st.steps\3les.php on line 52
int(10) 
bool(true) 
bool(true) 
bool(true)

P.S: Курс понравился буду проходить дальше :smile:

Koala
Koala

Оу, не поддерживает emodji ((

ivashkevich
ivashkevich

Только символы, только хардкор! Удачи в прохождении :)

nemo.dont@gmail.com
nemo.dont@gmail.com

код
echo '!1 ';
var_dump(!1);
echo '<br>';

echo '!0 ';
var_dump(!0);
echo '<br>';

echo '!true ';
var_dump(!true);
echo '<br>';

echo '2 && 3 ';
var_dump(2 && 3);
echo '<br>';

echo '5 && 0 ';
var_dump(5 && 0);
echo '<br>';

echo '3 || 0 ';
var_dump(3 || 0);
echo '<br>';

echo '5 / 1 ';
var_dump(5 / 1);
echo '<br>';

echo '1 / 5 ';
var_dump(1 / 5);
echo '<br>';

echo '5 + \'5string\' ';
var_dump(5 + '5string');
echo '<br>';

echo '\'5\' == 5 ';
var_dump('5' == 5);
echo '<br>';

echo '\'05\' == 5 ';
var_dump('05' == 5);
echo '<br>';

echo '\'05\' == \'5\' ';
var_dump('05' == '5');
echo '<br>';

то что выводится в браузере
!1 bool(false)
!0 bool(true)
!true bool(false)
2 && 3 bool(true)
5 && 0 bool(false)
3 || 0 bool(true)
5 / 1 int(5)
1 / 5 float(0.2)
5 + '5string' int(10)
'5' == 5 bool(true)
'05' == 5 bool(true)
'05' == '5' bool(true)

anastasiia.khaliuk@yandex.ru
anastasiia.khaliuk@yandex.ru

Почему-то не получается открыть в браузере, в прошлом задании (делала несколько дней назад) все получалось. Теперь по адресу http://myproject.loc/index.php выдает следующее: "Не удается получить доступ к сайту
Сайт myproject.loc не позволяет установить соединение."

ivashkevich
ivashkevich

OpenServer не запущен =)

Dilik
Dilik

Честно говоря чего то не догнал суть домашки...
По идее просто в var_dump проставить все эти выражения?!

ivashkevich
ivashkevich

Да, просто сначала предположите результаты, а затем сравните их с тем, что получается на самом деле.

ArtemijeKA
ArtemijeKA

Доброго времени суток! Можно узнать, что за расширение показывает разными цветами вывод var_dump(); в браузере?

ivashkevich
ivashkevich

Привет! XDebug. С ним вы еще столкнетесь через пару уроков.

rlean
rlean

Здравствуйте! У меня PHPStorm при написании кода var_dump ( expression: '05' == '5' ); сам добавляет выражение expression: всегда. Избавиться от этого не получилось самостоятельно. Должно ли так быть и на что это влияет? Спасибо!

ivashkevich
ivashkevich

Здравствуйте, в настройках шторма можете убрать, называется "Show parameter name hints"

paradise1983@icloud.com
paradise1983@icloud.com

Прошу прощения, но если честно непонятно задание.
Что нужно делать с этими значениями?
!1
!0
!true
2 && 3
5 && 0
3 || 0
5 / 1
1 / 5
5 + '5string'
'5' == 5
'05' == 5
'05' == '5'


Я ж могу из через string вывести.
Например, в описываемом уроке не нашёл аналогичные результаты примеров:
!1
!0
!true

ivashkevich
ivashkevich

Здравствуйте, задание просто для того, чтобы ознакомиться с тем, как работает приведение типов в PHP =)
Можно просто проверить себя - предполагаете, какой должен получиться результат и смотрите что на самом деле.