Пріоритет оператора
Пріоритет оператора визначає, наскільки «тісно» він пов'язує між собою два вирази. Наприклад, вираз 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)
Вказівка дужок, навіть якщо це не суворо необхідно, часто може покращити читання коду за рахунок явного угруповання, а не опори на пріоритети та асоціативність.
У наступній таблиці наведено список операторів, відсортований за зменшенням їх пріоритетів. Оператори, перелічені в одному рядку, мають однаковий пріоритет, тоді порядок їх виконання буде визначено тим, як вони згруповані.
Порядок виконання операторів
Ассоциативность | Оператор | Дополнительная информация |
---|---|---|
(н/а) | 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 | |
ліва | 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 | Практика, коли можна було покладатися на лівоасоціативність тернарного оператора (? : ), т. е. вкладення кількох тернарних операторів без дужок, не рекомендовано. |