## Operator Precedence

The precedence of an operator specifies how "tightly" it binds two expressions together. For example, in the expression 1 + 5 * 3, the answer is 16 and not 18 because the multiplication ("*") operator has a higher precedence than the addition ("+") operator. Parentheses may be used to force precedence, if necessary. For instance: (1 + 5) * 3 evaluates to 18.

When operators have equal precedence, their associativity decides whether they are evaluated starting from the right, or starting from the left - see the examples below.

The following table lists the operators in order of precedence, with the highest-precedence ones at the top. Operators on the same line have equal precedence, in which case associativity decides the order of evaluation.

Operator Precedence
non-associative clone new clone and new
left [ array()
non-associative ++ -- increment/decrement
right ~ - (int) (float) (string) (array) (object) (bool) @ types
non-associative instanceof types
right ! logical
left * / % arithmetic
left + - . arithmetic and string
left << >> bitwise
non-associative < <= > >= <> comparison
non-associative == != === !== comparison
left & bitwise and references
left ^ bitwise
left | bitwise
left && logical
left || logical
left ? : ternary
right = += -= *= /= .= %= &= |= ^= <<= >>= => assignment
left and logical
left xor logical
left or logical
left , many uses

For operators of equal precedence, left associativity means that evaluation proceeds from left to right, and right associativity means the opposite.

Example #1 Associativity

<?php
\$a
5// (3 * 3) % 5 = 4
\$a true true 2// (true ? 0 : true) ? 1 : 2 = 2

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

// mixing ++ and + produces undefined behavior
\$a 1;
echo ++
\$a \$a++; // may print 4 or 5
?>
Use of parentheses, even when not strictly necessary, can often increase readability of the code.

Note:

Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!\$a = foo()), in which case the return value of foo() is put into \$a.