因为js经常有这样的写法,但是我在php下试了却不行,$a
为null
,false
,-1
时都无效。
现在用的比较啰嗦的写法:
$a = $a?$a:$b;
$a = is_*($a)?$a:$b;
但是如何满足这样的写法:
$a = $a or $b;
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的。
PHP中文网2017-04-10 13:11:18
又回到了一年一度,一月一次不得不提及的PHP运算符优先级问题了!回答这个问题之前,不得不把我之前回答的一个问题链接给题主看看:PHP陷阱?
看了上面的链接你可能就会明白,实际上呢你写的这句话在PHP中根本不会完成你想要的效果,如果你还不明白的话我给你加上括号吧:
($a = $a) or $b;
怎么样看懂了吧,从左往右读,赋值的操作比或操作优先执行,最后这句话被解析成了一个或操作,然后左边是一个将本身赋值给本身的操作,必然为true
所以你会发现$a
的值永远是不会变的。
最后是一句题外话,PHP目前我的认识里头好像没办法写成这种形式应该,如果有的话请告知我,谢谢!
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 两个操作符的优先级不一样:
PHP操作符优先级:http://www.php.net/manual/en/language.operators.precedence.php