search

Home  >  Q&A  >  body text

javascript - PHP什么情况下可以写: $a = $a or $b;

因为js经常有这样的写法,但是我在php下试了却不行,$anullfalse-1时都无效。
现在用的比较啰嗦的写法:

$a = $a?$a:$b;
$a = is_*($a)?$a:$b;

但是如何满足这样的写法:

$a = $a or $b;
迷茫迷茫2820 days ago552

reply all(4)I'll reply

  • PHPz

    PHPz2017-04-10 13:11:18

    PHP是不支持$a = $a || $b;这种赋值写法的,这样写返回的是一个或运算的布尔值。(优先级请阅读 @qinjianxiang 同学的答案 )

    但是,对于PHP本身提供的三元运算(expr1) ? (expr2) : (expr3)PHP5.3开始已经可以省略expr2,因此你可以简写成下面这样:

    $a = $a ?: $b;
    

    简洁程度应该跟JS里面的a = a || b差不多吧? 但是要注意:PHP中 0、null、''(空字符串)都是==false的。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 13:11:18

    又回到了一年一度,一月一次不得不提及的PHP运算符优先级问题了!回答这个问题之前,不得不把我之前回答的一个问题链接给题主看看:PHP陷阱?

    看了上面的链接你可能就会明白,实际上呢你写的这句话在PHP中根本不会完成你想要的效果,如果你还不明白的话我给你加上括号吧:

    ($a = $a) or $b;
    

    怎么样看懂了吧,从左往右读,赋值的操作比或操作优先执行,最后这句话被解析成了一个或操作,然后左边是一个将本身赋值给本身的操作,必然为true所以你会发现$a的值永远是不会变的。

    最后是一句题外话,PHP目前我的认识里头好像没办法写成这种形式应该,如果有的话请告知我,谢谢!

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 13:11:18

    PHP里的 || 和 or 操作符返回值都是布尔值,所以,不可能实现像Javascript和Perl里那样的a = a || b的效果了。

    最接近最简洁的写法便是?:操作符:

    $a = $a ? $a : $b;
    

    那么$a = $a or $b到底返回什么呢?且看一段测试代码:

    <?php
    $a = 0 || false;
    var_dump($a);
    
    $a = 0 or false;
    var_dump($a);
    

    它将输出:

    bool(false)
    int(0)

    为什么输出不一样?因为 || 和 or 两个操作符的优先级不一样:

    • ||优先级比=高,所以,$a = $a || $b,等同于$a = ($a || $b),是先拿$a, $b求或,得到一个boolean,再把这个boolean赋值给$a
    • or优先级比=低,所以,$a = $a or $b,等同于($a = $a) or $b,先执行$a = $a,再把$a的值和$b执行or操作,但操作结果不赋值给任何变量,所以你观察不到$a的值被改变

    PHP操作符优先级:http://www.php.net/manual/en/language.operators.precedence.php

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 13:11:18

    挖坟的问题了,一直忘了结贴,现在自问自答,就当给sf做个seo吧.
    楼上说的都对,现在PHP7开始有了??操作符就是做这个事情的.

    reply
    0
  • Cancelreply