首页 > 后端开发 > php教程 > javascript - PHP什么情况下可以写: $a = $a or $b;

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

WBOY
发布: 2016-06-06 20:48:09
原创
915 人浏览过

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

<code class="lang-php">$a = $a?$a:$b;
$a = is_*($a)?$a:$b;
</code>
登录后复制
登录后复制

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

<code class="lang-php">$a = $a or $b;
</code>
登录后复制
登录后复制

回复内容:

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

<code class="lang-php">$a = $a?$a:$b;
$a = is_*($a)?$a:$b;
</code>
登录后复制
登录后复制

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

<code class="lang-php">$a = $a or $b;
</code>
登录后复制
登录后复制

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

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

<code>$a = $a ?: $b;
</code>
登录后复制

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

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

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

<code>($a = $a) or $b;
</code>
登录后复制

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

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

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

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

<code>$a = $a ? $a : $b;
</code>
登录后复制

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

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

$a = 0 or false;
var_dump($a);
</code></code>
登录后复制

它将输出:

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

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

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板