今天在羣裏無心間看到一個網友問的一個問題ide
$a=$b=0;
if($a=0 || $b =2)
{
var_dump($a,$b);
}fetch
輸出:
bool(true)
int(2)spa
誰能解釋一下$a 爲何是true?get
我對這個問題也挺好奇…開始沒有想到優先級
後來用vld翻開PHP執行生成的OP來觀察,才發現..是優先級的問題string
- number of ops: 12
- compiled vars: !0 = $a, !1 = $b
- line # * op fetch ext return operands
- ---------------------------------------------------------------------------------
- 2 0 > ASSIGN RES[ IS_VAR $0 ] OP1[ IS_CV !1 ] OP2[ , IS_CONST (0) 0 ]
- 1 ASSIGN OP1[ IS_CV !0 ] OP2[ , IS_VAR $0 ]
- 3 2 > JMPNZ_EX RES[ IS_TMP_VAR ~2 ] OP1[ IS_CONST (0) 0 ] OP2[ , ->5 ]
- 3 > ASSIGN RES[ IS_VAR $3 ] OP1[ IS_CV !1 ] OP2[ , IS_CONST (0) 2 ]
- 4 BOOL RES[ IS_TMP_VAR ~2 ] OP1[ IS_VAR $3 ]
- 5 > ASSIGN RES[ IS_VAR $4 ] OP1[ IS_CV !0 ] OP2[ , IS_TMP_VAR ~2 ]
- 6 > JMPZ OP1[ IS_VAR $4 ] OP2[ , ->11 ]
- 4 7 > SEND_VAR OP1[ IS_CV !0 ]
- 8 SEND_VAR OP1[ IS_CV !1 ]
- 9 DO_FCALL 2 OP1[ IS_CONST (34085885) 'var_dump' ]
- 5 10 > JMP OP1[ ->11 ]
- 15 11 > > RETURN OP1[ IS_CONST (0) 1 ]
下面這段代碼it
- 2 0 > ASSIGN RES[ IS_VAR $0 ] OP1[ IS_CV !1 ] OP2[ , IS_CONST (0) 0 ]
- 1 ASSIGN OP1[ IS_CV !0 ] OP2[ , IS_VAR $0 ]
沒有異議,若是熟悉PHP內核的人一看就知道 ASSIGN 就是給變量賦值
對應的是 $a=$b=0;
重點就在這裏了class
- 3 2 > JMPNZ_EX RES[ IS_TMP_VAR ~2 ] OP1[ IS_CONST (0) 0 ] OP2[ , ->5 ]
- 3 > ASSIGN RES[ IS_VAR $3 ] OP1[ IS_CV !1 ] OP2[ , IS_CONST (0) 2 ]
- 4 BOOL RES[ IS_TMP_VAR ~2 ] OP1[ IS_VAR $3 ]
- 5 > ASSIGN RES[ IS_VAR $4 ] OP1[ IS_CV !0 ] OP2[ , IS_TMP_VAR ~2 ]
- 6 > JMPZ OP1[ IS_VAR $4 ] OP2[ , ->11 ]
||在PHP裏被解析成JMPNZ_EX 這裏先執行了||變量
IS_TMP_VAR 是臨時變量的意思 這裏保存一個臨時變量 ~2它的值是 0im
- ASSIGN RES[ IS_VAR $3 ] OP1[ IS_CV !1 ] OP2[ , IS_CONST (0) 2 ]
這句代碼執行的是 $b=2; 而後保存到變量 $3裏.
BOOL RES[ IS_TMP_VAR ~2 ] OP1[ IS_VAR $3 ]
$3與 臨時變量~2比較
也就是執行了代碼 $3||0 ,返回的值~2確定是真margin
- ASSIGN RES[ IS_VAR $4 ] OP1[ IS_CV !0 ] OP2[ , IS_TMP_VAR ~2 ]
最後 ~2的值 賦給$a;
這個時候 $a 和 $b的值都爲真
那麼 var_dump輸出 true 也就是理所應當的事了..