坑爹的php优先级面试题

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;
        } 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,760评论 18 399
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 27,726评论 5 19
  • FreeCodeCamp - Basic JavaScript 写在前面: 我曾经在进谷前刷过这一套题,不过当时只...
    付林恒阅读 16,512评论 5 28
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,510评论 0 17
  • 当有人突然从你的生命中消失,不用问为什么,毫无意义,只需接受就好。生活不是电视剧,没有重新来过,有的只是因果。
    芒有果阅读 199评论 0 0