PHP 運算符的優先級

 今天在羣裏無意間看到一個網友問的一個問題

$a=$b=0;
if($a=0 || $b =2)
{
var_dump($a,$b);
}

輸出:
bool(true)
int(2)

誰能解釋一下$a 爲什麼是true?

我對這個問題也挺好奇…開始沒有想到優先級
後來用vld翻開PHP執行生成的OP來觀察,才發現..是優先級的問題

 

  1. number of ops:  12 
  2. compiled vars:  !0 = $a, !1 = $b 
  3. line     # *  op                           fetch          ext  return  operands 
  4. --------------------------------------------------------------------------------- 
  5.    2     0  >   ASSIGN                                            RES[  IS_VAR $0 ]       OP1[  IS_CV !1 ] OP2[ ,  IS_CONST (0) 0 ] 
  6.          1      ASSIGN                                                    OP1[  IS_CV !0 ] OP2[ ,  IS_VAR $0 ] 
  7.    3     2    > JMPNZ_EX                                          RES[  IS_TMP_VAR ~2 ]       OP1[  IS_CONST (0) 0 ] OP2[ , ->5 ] 
  8.          3  >   ASSIGN                                            RES[  IS_VAR $3 ]       OP1[  IS_CV !1 ] OP2[ ,  IS_CONST (0) 2 ] 
  9.          4      BOOL                                              RES[  IS_TMP_VAR ~2 ]       OP1[  IS_VAR $3 ] 
  10.          5  >   ASSIGN                                            RES[  IS_VAR $4 ]       OP1[  IS_CV !0 ] OP2[ ,  IS_TMP_VAR ~2 ] 
  11.          6    > JMPZ                                                      OP1[  IS_VAR $4 ] OP2[ , ->11 ] 
  12.    4     7  >   SEND_VAR                                                  OP1[  IS_CV !0 ] 
  13.          8      SEND_VAR                                                  OP1[  IS_CV !1 ] 
  14.          9      DO_FCALL                                      2           OP1[  IS_CONST (34085885) 'var_dump' ] 
  15.    5    10    > JMP                                                       OP1[ ->11 ] 
  16.   15    11  > > RETURN                                                    OP1[  IS_CONST (0) 1 ] 

下面這段代碼

 

  1. 2     0  >   ASSIGN                                            RES[  IS_VAR $0 ]       OP1[  IS_CV !1 ] OP2[ ,  IS_CONST (0) 0 ] 
  2.       1      ASSIGN                                                    OP1[  IS_CV !0 ] OP2[ ,  IS_VAR $0 ] 

沒有異議,如果熟悉PHP內核的人一看就知道 ASSIGN 就是給變量賦值
對應的是 $a=$b=0;
重點就在這裏了

 

  1. 3     2    > JMPNZ_EX                                          RES[  IS_TMP_VAR ~2 ]       OP1[  IS_CONST (0) 0 ] OP2[ , ->5 ] 
  2.       3  >   ASSIGN                                            RES[  IS_VAR $3 ]       OP1[  IS_CV !1 ] OP2[ ,  IS_CONST (0) 2 ] 
  3.       4      BOOL                                              RES[  IS_TMP_VAR ~2 ]       OP1[  IS_VAR $3 ] 
  4.       5  >   ASSIGN                                            RES[  IS_VAR $4 ]       OP1[  IS_CV !0 ] OP2[ ,  IS_TMP_VAR ~2 ] 
  5.       6    > JMPZ                                                      OP1[  IS_VAR $4 ] OP2[ , ->11 ] 

||在PHP裏被解析成JMPNZ_EX 這裏先執行了||

IS_TMP_VAR 是臨時變量的意思 這裏保存一個臨時變量 ~2它的值是 0

  1. 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肯定是真

 

  1. ASSIGN                                            RES[  IS_VAR $4 ]       OP1[  IS_CV !0 ] OP2[ ,  IS_TMP_VAR ~2 ] 

最後 ~2的值 賦給$a;
這個時候 $a 和 $b的值都爲真
那麼 var_dump輸出 true 也就是理所應當的事了..

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章