PHPで&&が
◆ やっぱり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のです