php == 优先级,PHP 运算符的优先级

今天在群里无意间看到一个网友问的一个问题

$a=$b=0;

if($a=0 || $b =2)

{

var_dump($a,$b);

}

输出:

bool(true)

int(2)

谁能解释一下$a 为什么是true?

我对这个问题也挺好奇…开始没有想到优先级

后来用vld翻开PHP执行生成的OP来观察,才发现..是优先级的问题

number of ops:  12

compiled vars:  !0 = $a, !1 = $b

line     # *  op                           fetch          ext  returnoperands

---------------------------------------------------------------------------------

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      BOOLRES[  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 ]

下面这段代码

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;

重点就在这里了

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      BOOLRES[  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它的值是 0

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

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

最后 ~2的值 赋给$a;

这个时候 $a 和 $b的值都为真

那么 var_dump输出 true 也就是理所应当的事了..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值