Операторы php приоритет операторов

PHP: Выражения и операторы

Выражение — это любая единица исходного кода программы, которая может быть вычислена для получения значения, например, вызов функции, использование операторов, или просто обращение к переменной по имени. В PHP почти всё является выражением.

Выражения делятся на простые (их также называют первичными) и сложные. Первичные выражения являются самостоятельными выражениями — они не включают в себя ещё более простых выражений. Например, к первичным выражениям относятся: идентификаторы, литералы и оператор группировки. Сложные выражения состоят из простых выражений. Типичный способ конструирования сложных выражений из простых выражений заключается в использовании операторов:

// Примеры первичных выражений 11 // Числовой литерал $str // Возвращает значение переменной [] // Литерал массива () // Оператора группировки // Примеры сложных выражений $alpha + 19 // Возвращает результат арифметической операции ($alpha - 37) * $beta / 2 // Возвращает результат арифметических операций foo() // Возвращает результат вызова функции $mass[1] // Возвращает значение элемента массива

Некоторые выражения, так же как и инструкции, оканчиваются точкой с запятой, например:

Таким образом, разница между выражением и инструкцией заключается в том, что любое выражение — это то, что вычисляется для получения значения, а инструкция — это просто указание на совершение какого-либо действия.

Операторы

Оператор — это элемент программного кода, который описывает то или иное действие в выражении. В PHP оператор представляет собой символ, благодаря которому могут производиться различные виды вычислений, сравнений или присваиваний с участием одного или нескольких значений. Разные операторы отличаются типом и количеством операндов. В PHP используется несколько типов операторов: арифметические, присваивания, сравнения, логические и поразрядные (побитовые). Значения, расположенные по сторонам операторов, называются операндами:

Числовые литералы по обе стороны от оператора + являются его операндами. Операнд — это то, на что воздействует оператор. Операнды и операторы дают в результате выражение, которое формирует новое значение.

Из всего вышесказанного можно сделать вывод, что выражением называются два или больше подвыражений, объединенных операторами. Чем больше у вас подвыражений и операторов, тем длиннее и сложнее выражение.

При работе с операторами особое значение имеют следующие аспекты:

  • количество операндов
  • тип операндов
  • приоритет (порядок исполнения)
  • ассоциативность операторов

Количество операндов

Разные операторы принимают разное количество операндов. Операторы, которые работают с двумя операндами называются бинарными , к таким операторам относятся сложение, вычитание умножение и т.д.

Другие операторы могут принимать всего один операнд, они называются унарными . Примерами унарного оператора могут служить унарный минус (-), инкремент, декремент и т.д.

Читайте также:  Class selector html css

Существует также один оператор, который может работать с тремя операндами, такой оператор называется тернарный . Этим оператором является оператор, представляющий собой сокращенную форму записи условного оператора if, о котором мы поговорим позже, когда будем рассматривать условные операторы.

Типы операндов

Создавая выражения, необходимо обращать внимание на типы операндов, с которыми работает каждый из операторов, потому что каждый оператор ожидает получить операнды конкретного типа данных. Например, нельзя выполнить умножение двух строк

Однако PHP старается максимально облегчить вам жизнь, автоматически выполняя необходимые преобразования типов операндов для конкретных операторов. Следующее выражение вполне допустимо:

В этом выражении интерпретатор PHP автоматически преобразует строки в числа и перемножает их. Но иногда такое автоматическое преобразование невозможно, поэтому будьте внимательны и следите за используемыми типами операндов.

Примечание: Когда PHP выполняет автоматическое преобразование типа, это называется неявным приведением типа, если преобразование типа выполняется вручную — это называется явным приведением типа.

Приоритет

Приоритет оператора определяет порядок исполнения операций при вычислении значения выражения.

Операторы с одинаковым приоритетом обрабатываются в порядке следования в выражении. Например, операции умножения и деления исполняются в том порядке, в котором следуют в выражении, потому что они имеют одинаковый приоритет.

Если выражение содержит операторы с разным приоритетом, то порядок их исполнения может влиять на конечный результат выражения. С помощью круглых скобок ( и ) можно переопределить порядок исполнения операторов или просто улучшить читаемость выражения.

Во втором выражении умножение будет выполняться после сложения, потому что порядок исполнения операторов был переопределен с помощью круглых скобок.

Ассоциативность

Все операторы обрабатывают свои операнды в определенном направлении. Направление обработки называется ассоциативностью и зависит от типа оператора. Большинство операторов выполняет обработку слева направо — такой порядок называется левой ассоциативностью. Левая ассоциативность подразумевает, что выражение вычисляется слева направо, правая ассоциативность — в обратном направлении.

Таблица операторов

В PHP есть несколько уровней приоритетов, в таблице приведен перечень операторов, отсортированных по уровню приоритета, от высшего к низшему. Операторы на одном уровне имеют одинаковый приоритет.

В колонке «Ассоциативность» помечены операторы, которые имеют правую ассоциативность, остальные относятся к левой.

Оператор Описание Ассоциативность
NEW Создает новый объект Справа налево
.
[]()
Доступ к свойству (точечная нотация)
Индекс массива
Вызов функции
!
~
++, —
+, —
(int)
(float/double/real)
(string)
(array)
(object)
@
Логическое НЕ
Битовое НЕ
Операторы инкремента и декремента
Унарный плюс и минус
Оператор приведения типа
Оператор приведения типа
Оператор приведения типа
Оператор приведения типа
Оператор приведения типа
Подавление вывода сообщений об ошибках
Справа налево
*, /, % Умножение, деление
+, —
.
Сложение, вычитание
Конкатенация
> Битовый сдвиг
, >= Операторы сравнения
==, !=
===, !==, <>
Операторы сравнения
& Битовое И
ˆ Битовое ИЛИ-НЕ
| Битовое ИЛИ
&& Логическое И
|| Логическое ИЛИ
? : Условный (тернарный) оператор
=, +=, -=, *=, /=, .=, %=,
&=, |=, ^=, >=, =>
Операторы присваивания Справа налево
AND Логическое И
XOR Логическое ИЛИ-НЕ
OR Логическое ИЛИ
, Оператор запятая
Читайте также:  How to code in python for beginners

Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011 – 2023 © puzzleweb.ru

Источник

Операторы php приоритет операторов

Приоритет оператора определяет, насколько «тесно» он связывает между собой два выражения. Например, выражение 1 + 5 * 3 вычисляется как 16 , а не 18 , поскольку оператор умножения («*») имеет более высокий приоритет, чем оператор сложения («+»). Круглые скобки могут использоваться для принудительного указания порядка выполнения операторов. Например, выражение (1 + 5) * 3 вычисляется как 18 .

Если операторы имеют равный приоритет, то будут ли они выполняться справа налево или слева направо определяется их ассоциативностью. К примеру, «-» является лево-ассоциативным оператором. Следовательно 1 — 2 — 3 сгруппируется как (1 — 2) — 3 и пересчитается в -4 . С другой стороны «=» — право-ассоциативный оператор, так что $a = $b = $c сгруппируется как $a = ($b = $c) .

Неассоциативные операторы с одинаковым приоритетом не могут использоваться совместно. К примеру 1 < 2 >1 не будет работать в PHP. Выражение 1

Ассоциативность имеет смысл только для двоичных (и тернарных) операторов. Унарные операторы являются префиксными или постфиксными, поэтому это понятие не применимо. Например, !!$a можно сгруппировать только как !(!$a) .

Использование скобок, кроме случаев когда они строго необходимы, может улучшить читаемость кода, группируя явно, а не полагаясь на приоритеты и ассоциативность.

В следующей таблице приведён список операторов, отсортированный по убыванию их приоритетов. Операторы, размещённые в одной строке имеют одинаковый приоритет и порядок их выполнения определяется исходя из их ассоциативности.

Порядок выполнения операторов
Ассоциативность Оператор Дополнительная информация
(н/а) clone new clone и new
правая ** арифметические операторы
(н/а) + — ++ — ~ (int) (float) (string) (array) (object) (bool) @ арифметические операторы (унарные + и — ), инкремент/декремент, побитовые операторы, приведение типов и оператор управления ошибками
левая instanceof типы
(н/а) ! логические операторы
левая * / % арифметические операторы
левая + — . арифметические операторы (бинарные + и — ), операторы, работающие с массивами и строковые операторы ( . до PHP 8.0.0)
левая > побитовые операторы
левая . строковые операторы (начиная с PHP 8.0.0)
неассоциативна < >= операторы сравнения
неассоциативна == != === !== <> операторы сравнения
левая & побитовые операторы и ссылки
левая ^ побитовые операторы
левая | побитовые операторы
левая && логические операторы
левая || логические операторы
правая ?? операторы сравнения с null
неассоциативна ? : тернарный оператор (лево-ассоциативный до PHP 8.0.0)
правая = += -= *= **= /= .= %= &= |= ^= <>= ??= операторы присваивания
(н/а) yield from yield from
(н/а) yield yield
(н/а) print print
левая and логические операторы
левая xor логические операторы
левая or логические операторы

Пример #1 Ассоциативность

$a = 3 * 3 % 5 ; // (3 * 3) % 5 = 4
// ассоциативность тернарных операторов отличается от C/C++
$a = true ? 0 : true ? 1 : 2 ; // (true ? 0 : true) ? 1 : 2 = 2 (до PHP 8.0.0)

$a = 1 ;
$b = 2 ;
$a = $b += 3 ; // $a = ($b += 3) -> $a = 5, $b = 5
?>

Приоритет и ассоциативность оператора определяет только то, как группируется выражение, а не порядок его вычисления. Обычно PHP не указывает, в каком порядке вычисляются выражения и кода, который предполагает специфичный порядок вычисления следует избегать, потому, что поведение может меняться в разных версиях PHP или в зависимости от окружающего кода.

Пример #2 Неопределённый порядок вычисления

$a = 1 ;
echo $a + $a ++; // может вывести как 2 так и 3

$i = 1 ;
$array [ $i ] = $i ++; // может установить индекс как 1, так 2
?>

Пример #3 + , — и . имеют одинаковый приоритет (до PHP 8.0.0)

$x = 4 ;
// следующий код может выдать неожиданный результат:
echo «x минус 1 равно » . $x — 1 . «, ну я надеюсь\n» ;
// поскольку он вычисляется таким образом (до PHP 8.0.0):
echo (( «x минус один равно » . $x ) — 1 ) . «, ну я надеюсь\n» ;
// требуемый приоритет следует задать скобками:
echo «x минус 1 равно » . ( $x — 1 ) . «, ну я надеюсь\n» ;
?>

Результат выполнения данного примера:

-1, ну я надеюсь -1, ну я надеюсь x минус один равно 3, ну я надеюсь

Замечание:

Несмотря на то, что = имеет более низкий приоритет, чем большинство других операторов, PHP всё же позволяет делать так: if (!$a = foo()) , в этом примере результат выполнения foo() будет присвоен $a .

Список изменений

Версия Описание
8.0.0 Объединение строк ( . ) теперь имеет более низкий приоритет, чем арифметическое сложение/вычитание ( + и — ) и побитовый сдвиг влево/вправо ( > ); ранее он имел тот же приоритет, что и + и — , и более высокий приоритет, чем > .
8.0.0 Тернарный оператор ( ? : ) теперь неассоциативен; ранее он был лево-ассоциативным.
7.4.0 Опираясь на приоритет конкатенации строк ( . ) относительно арифметического сложения/вычитания ( + или — ) или побитового сдвига влево/вправо ( > ), т.е. их совместное использование в выражении без скобок не рекомендуется.
7.4.0 Не рекомендуется полагаться на лево-ассоциативность тернарного оператора ( ? : ), т.е. вложение нескольких тернарных операторов без скобок.

Источник

Оцените статью