xor 演算子の優先順位は = (代入)より下位
自戒を兼ねて記事にします。内容はタイトルの通りなんですが知らずハマりました……
結論
xor より代入のほうが優先順位が上なので $a に代入される値は xor が処理される前の値になります。
$a = true xor false; // true $a = false xor true; // false
そのため、意図した値を変数に格納するには括弧をつけて、代入より先に処理を実行させる必要があります。
$c = (false xor true); // true
&&
や||
と同じレベルだと思っていたのでまさか優先順位の問題だと思わずハマりました…
演算子の優先順位
ふと気づいて括弧つけたら意図した挙動になったのでドキュメントを確認したらその通りでした。
とりあえず以下のようにざっくり覚えておくことにしました。
&&
||
などの記号系=
代入and
or
xor
などの英字系