PHP运算符优先级:你踩过这些坑吗?

写PHP代码的时候,你是不是经常遇到一些让人抓狂的情况?明明代码逻辑是对的,但结果就是跟预期不一样。很多时候,这就是运算符优先级在作怪。今天就来聊聊PHP中运算符优先级的那点事,顺便分享一些我在项目中踩过的坑。

先来说说什么是运算符优先级。简单来说,就是在一个表达式中,哪个运算符会先执行。比如1 + 2 3,乘法优先级比加法高,所以先算2 3,再算1 + 6,结果是7。如果你以为从左到右算,结果就是9,那就踩坑了。

PHP中的运算符优先级其实和大多数编程语言差不多,但还是有一些独特的地方。先来看一下PHP的运算符优先级表(从高到低):

1. clone和new

2. []

3.

4. ++ -- ~ (int) (float) (string) (array) (object) (bool) @

5. instanceof

6. !

7. / %

8. + - .

9. << >>

10. < <= > >=

11. == != === !== <> <=>

12. &

13. ^

14. |

15. &&

16. ||

17. ??

18. ? :

19. = += -=

=
= /= .= %= &= |= ^= <<= >>=

20. and

21. xor

22. or

是不是有点眼花?别担心,其实不用记这么多,只要记住几个常见的坑就行。

先说说常见的坑之一:&&和||的优先级。看这段代码:

$condition1 = true;

$condition2 = false;

if ($condition1 && $condition2 || $condition3) {

echo 'true';

} else {

echo 'false';

}

你以为会是false,因为$condition2是false,实际上却是true。为啥?因为||的优先级比&&低,所以先算$condition1 && $condition2,结果是false,再算false || $condition3,结果是true。如果你想要先算$condition2 || $condition3,得加括号:

if ($condition1 && ($condition2 || $condition3)) {

} else {

}

这样结果就是false了。

再来一个常见的坑:三元运算符的嵌套。看这段代码:

$value = true ? 'a' : false ? 'b' : 'c';

你以为$value是'a',实际上是'b'。为啥?因为三元运算符是右结合的,所以先算false ? 'b' : 'c',结果是'c',再算true ? 'a' : 'c',结果是'a'。如果你想要先算true ? 'a' : false,得加括号:

这样结果就是'b'了。

还有一个坑是关于.=运算符的。看这段代码:

$string1 = 'a';

$string1 .= $string2 . $string3;

你以为$string1是'abc',实际上是'ab c'。为啥?因为.的优先级比.=高,所以先算$string2 . $string3,结果是'bc',再算$string1 .= 'bc',结果是'abc'。如果你想要先算$string1 .= $string2,得加括号:

这样结果就是'abc'了。

在实际项目中,运算符优先级导致的bug往往很难发现。有一次,我在写一个复杂的条件判断时,因为漏掉了一个括号,导致整个系统的权限控制失效,差点酿成大祸。从那以后,我就养成了写复杂表达式时多加括号的习惯。毕竟,多加几个括号总比出问题强,对?

再来说说一些常用的技巧。比如,当你需要在多个条件中判断一个变量是否为null时,可以用??运算符。看这段代码:

$value = $a ?? $b ?? $c ?? 'default';

如果$a不是null,$value就是$a;如果$a是null,$value就是$b;如果$b也是null,$value就是$c;如果$c也是null,$value就是'default'。这个运算符的优先级比大部分运算符都低,所以要注意。

再来一个常用的技巧是用?:运算符。看这段代码:

$value = $a ?: 'default';

如果$a为true,$value就是$a;如果$a为false,$value就是'default'。

来说说一些运算符的注意事项。首先是++和--运算符。看这段代码:

$a = 1;

$b = $a++;

$c = ++$a;

你以为$b是2,$c是3,实际上$b是1,$c是3。为啥?因为$a++是先赋值,再自增;++$a是先自增,再赋值。这个细节很多人都会忽略。

再来看看位运算符。比如&和|。看这段代码:

$a = 5;

$b = 3;

$c = $a & $b;

$d = $a | $b;

你以为$c是5,$d是3,实际上$c是1,$d是7。为啥?因为5的二进制是101,3的二进制是011,&是按位与,|是按位或,所以$c是001,$d是111。

来说说运算符。这是PHP 5.6引入的指数运算符。看这段代码:

$a = 2;

$b = 3;

$c = $a

$b;

你以为$c是8,实际上$c也是8。但要注意,的优先级比大部分运算符都高,所以要注意。

PHP中的运算符优先级虽然复杂,但只要掌握了常见的坑和技巧,就能写出更健壮的代码。在实际项目中,遇到复杂的表达式时,多加括号总是没错的。毕竟,代码的可读性和正确性比少敲几个字符更重要,对?

好了,今天就聊到这儿。如果你还有什么关于PHP运算符优先级的问题,欢迎留言讨论。希望我的分享能帮到你,少踩一些坑。下次见!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值