PHP - 演算子の優先順位

演算子の優先順位

演算子の優先順位は、二つの式が緊密に結合している度合いを指定します。例えば、式 1 + 5 * 3 の答えは 16 になり 18 とはなりません。これは乗算演算子は、加算演算子より高い優先順位を有するからです。必要に応じて強制的に優先順位を設定するために括弧を使用することが可能です。例えば、18 と評価するためには (1 + 5) * 3 とします。

演算子の優先順位が等しい場合は、その結合性によって評価順 (右から評価するのか、あるいは左から評価するのか) が決まります。例えば "-" は左結合なので、1 - 2 - 3(1 - 2) - 3 とグループ分けされて、評価結果は -4 になります。一方、"=" は右結合なので、$a = $b = $c のグループ分けは $a = ($b = $c) となります。

優先順位が同じで結合しない演算子を並べることはできません。例えば 1 < 2 > 1 は PHP では無効になります。一方 1 <= 1 == 1 は問題ありません。== 演算子の優先順位が <= 演算子より低いからです。

厳密には不要な場所であっても、括弧をつけておけばコードの可読性があがります。明示的にグループ分けをしておくことで、演算子の優先順位や結合性による暗黙のグループ分けに頼らずに済むからです。

以下は、優先順位が高い順に演算子を挙げています。同じ行にある演算子は優先順位が等しくなります。そのような場合は、結合時の評価にしたがってグループ分けが決まります。

  (n/a)         clone new
  right         **
  (n/a)         ++, --, ~, (int), (float), (string), (array), (object), (bool), @
  left          instanceof
  (n/a)         !
  left          *, /, %
  left          +, -, .
  left          <<, >>
  結合しない     <, <=, >, >=
  結合しない     ==, !=, ===, !==, <>, <=>
  left          &
  left          ^
  left          |
  left          &&
  left          ||
  right         ??
  left          ? :
  right         =, +=, -=, *=, **=, /=, .=, %=, &=, |=, ^=, <<=, >>=, ??=
  (n/a)         yield from
  (n/a)         yield
  (n/a)         print
  left          and
  left          xor
  left          or
演算子の優先順位

演算子の優先順位や結合性は、あくまでも式のグループ分けだけを決めるものであり、評価順を決めるものではありません。PHP では、式をどの順番で評価するかは決めていません。PHP のバージョンが変わったり前後のコードが変わったりしたときに、評価順が変わる可能性があるため、特定の順序で式が評価されることを前提としたコードを書いてはいけません。

関連記事