下面表格从高到低列出了php运算符的优先级。同一行中的运算符具有相同的优先级,此时它们的结合方向决定求值顺序。
表格 运算符优先级
结合方向 | 运算符 | 附加信息 |
非结合 | new | new |
左 | [ | array() |
非结合 | ++ – | 递增/递减运算符 |
非结合 | ! ~ - (int) (float) (string) (array) (object) @ | 类型 |
左 | * / % | 算数运算符 |
左 | + - . | 算数运算符和字符串运算符 |
左 | << >> | 位运算符 |
非结合 | < <= > >= | 比较运算符 |
非结合 | == != === !== | 比较运算符 |
左 | & | 位运算符和引用 |
左 | ^ | 位运算符 |
左 | | | 位运算符 |
左 | && | 逻辑运算符 |
左 | || | 逻辑运算符 |
左 | ? : | 三元运算符 |
右 | = += -= *= /= .= %= &= |= ^= <<= >>= | 赋值运算符 |
左 | and | 逻辑运算符 |
左 | xor | 逻辑运算符 |
左 | or | 逻辑运算符 |
左 | , | 多处用到 |
左联表示表达式从左向右求值,右联相反。
注: 尽管 ! 比 = 的优先级高,php 仍旧允许类似如下的表达式if (!$a = foo()),在此例中 foo() 的输出被赋给了 $a。
忽视PHP运算符优先级,有时候会浪费很多不必要的时间去处理,下面就以我遇到的几个优先级问题举例说明:
我们常用的几个运算符优先级从低到高:=、||、&&、== !=、> <、+ - .、* / %、! - (int) (float) (string) (array) (object) @、++ ---、new
虽然等于的优先级低于&&,但是这样的操作在PHP默认是可以的 $status && $id=123;