◆ やっぱりPHPの動きはよくわからない

JavaScriptでは

JavaScriptでは「&&」をif文代わりに使うことが多いです
書く文字が少なく済みますし 慣れると見やすいです
ですが代入があるときは注意しないといけません
a = 1; a == 1 && b = 2;

ReferenceError: Invalid left-hand side in assignment
というエラーになります

この式は「==」と「&&」と「=」があって優先順位は「==」→「&&」→「=」です
演算子の優先順位

なので
(a==1) && (b=2);
として欲しいのですが
実際には
((a==1) && b) = 2;
となっています
左辺が ((a==1) && b) と変数じゃなくなっていて代入ができないのでエラーが起きます

bが定義されてませんってエラーが出ないので計算するより先に構文を解析する時にエラーを検出してるみたいですね

なのでJavaScriptでは代入があるときは
a == 1 && (b = 2);
とカッコを書きます

PHPだと

基本的にJavaScriptと同じような演算子の優先順位なので
$a == 1 && $b = 2;
はエラー

PHPには「=」より優先順位の低い「and」や「or」があるのでこれを使って
$a == 1 and $b = 2;
にするとカッコなしでできる

と思っていました

やってみると
$a == 1 && $b = 2;
でエラーなし
問題なく代入が成功しています
$aが1じゃないときは$bはそのままです

なんで?!!

優先順位のページを読み直してると「結合しない」という言葉がありました
比較した結果は結合されないので&&の前後に分かれて処理が行われることになって大丈夫だったようです

複雑です

「結合しない」が原因のようだったので
$a && $b = 100;
で試してみると………動きます
今度は「結合しない」もないですし 「&&」のほうが「=」より優先順位が上です

演算子の優先順位のページの注意にあるように
if(!$a = 10) echo 1; else echo 0;
でもエラーは出ませんでした
もちろんJavaScriptなら左辺が代入できるものじゃないのでエラーです

「!」は普通に右結合で「=」より優先順位が高いのにどうして??

PHPがわけの分からない動きをすると言われる原因はこういうところでしょうね
演算子の優先順位表のような決まりを無視した特別な動きをするものが多すぎると思います

今回試したバージョンはPHP 5.5.14
repl.itのです