php的优先级是大家容易忽略的点,然而这个却是很多笔试愿意出的题目
来看几个例子
1、
$a = 3;
if ($a = 5) {
$a++;
}
var_dump($a);// (int)6
分析如下:
这里输出了 (int)6,因为条件中是赋值语句,肯定为真,所以执行$a++,故$a为6。
2、
<?php
$x = 2;
echo $x == 2 ? '我' : $x == 1 ? '你' : '它'; //你
分析如下:
很多人认为 会输出 ‘我’ ,按照三元运算符来说,确实如此。
但是
这里涉及到另一个知识点,三元运算符是左结合的特性,故上面代码等效为
echo ($x==2?'我':$x==1)?'你':'它';
所以上面代码又等效为
echo (true?'我':false)?'你':'它'
然后上面代码又等效为
echo '我'?'你':'它'`
所以这段代码输出的是 你
3、
$a = 3;
$b = 5;
if ($a = 3 || $b = 7) {
$a++;
$b++;
}
①因为 || 优先级高于赋值语句,所以上面代码等效于:
$a =(3 || $b=7)
所以$a=true,执行括号中的内容
②递增/递减不会影响布尔值,递减NULL没有效果,递增NULL会等于1,所以$a还是等于true,二$b等于6
所以答案为 true 和 6
注意
①本来|| 优先级是高于赋值语句,也就是说这样的代码:
$a = 3 || $b=7
应该变成这样的
$a = (3|| $b) = 7
可是php并没有这样处理,而是变成了
$a = (3||($b=7))
它把 || 右边的当做了一个整体进行执行了
再看下一个例子
<?php
$a = 3;
$b = 4;
if ( $a = 4 && $b = 5 && $b=7){
$a += 1;
$b += 1;
}
var_dump($a);(int)2
var_dump($b);(int)2
这个等效为
if ( $a = 4 && ($b = (5 && $b=7))){
$a += 1;
$b += 1;
}