Пріоритет оператора

Пріоритет оператора визначає, наскільки «тісно» він пов'язує між собою два вирази. Наприклад, вираз 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 <= 1 == 1 буде, оскільки в оператора == нижчий пріоритет, ніж у оператора <=

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

Вказівка ​​дужок, навіть якщо це не суворо необхідно, часто може покращити читання коду за рахунок явного угруповання, а не опори на пріоритети та асоціативність.

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

Порядок виконання операторів

АссоциативностьОператорДополнительная информация
(н/а)clonenewclone і new
права**арифметичні оператори
(н/а)+-++--~(int)(float)(string)(array)(object)(bool)@арифметичні оператори (Унарні + и-інкремент/декрементпобітові операториприведення типів і оператор керування помилками
ліваinstanceofтипи
(н/а)!логічні оператори
ліва*%арифметичні оператори
ліва+-арифметичні оператори (бінарні + и-оператори, які працюють з масивами і строкові оператори до PHP 8.0.0)
ліва<<>>побітові оператори
лівастрокові оператори(починаючи з PHP 8.0.0)
неасоціативна<<=>>=оператори порівняння
неасоціативна==!====!==<><=>оператори порівняння
ліва&побітові оператори і посилання
ліва^побітові оператори
ліва``
ліва&&логічні оператори
ліва`
права??оператори порівняння з null
неасоціативна? :тернарний оператор (лівоасоціативний до PHP 8.0.0)
права=+=-=*=**=/=.=%=&= `= ^= <<= >>= ??=`
(н/а)yield fromyield from
(н/а)yieldyield
(н/а)printprint
ліваandлогічні оператори
ліваxorлогічні оператори
ліваorлогічні оператори

Приклад #1 Асоціативність

Loading...

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

Приклад #2 Невизначений порядок обчислення

Loading...

Приклад #3+ -и мають однаковий пріоритет (до PHP 8.0.0)

Loading...

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

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

Зауваження :

Хотя оператор= і має нижчий пріоритет, ніж більшість інших операторів, PHP все ж дозволяє робити так: if (!$a = foo()), у цьому прикладі результат виконання функції foo()будет присвоен переменной $a.

список змін

ВерсияОпис
8.0.0Об'єднання рядків ( ) тепер має нижчий пріоритет, ніж арифметичне додавання/віднімання (+ и-) і побитовий зсув вліво/вправо (<<и>>); раніше він мав той самий пріоритет, що і + и-, і вищий пріоритет, ніж <<и>>
8.0.0Тернарний оператор (? :) тепер неасоціативний; раніше він був лівоасоціативним.
7.4.0Практика, коли можна було спиратися на пріоритет конкатенації рядків ( ) при арифметичних операціях складання/віднімання (+ или-) або побитовому зрушенні вліво/вправо (<<или>>), т. Е. Коли у виразі без дужок вони вказані разом, не рекомендована.
7.4.0Практика, коли можна було покладатися на лівоасоціативність тернарного оператора (? :), т. е. вкладення кількох тернарних операторів без дужок, не рекомендовано.