关于PHP条件运算符遇到的一个问题及解决方法_Yii_青云站长教程网
欢迎来到站长教程网!
  • 秒到短信接口 免费试用
  • 微信支付宝接口 秒结算
  • 中文网站排名|申请加入
  • 搜索引擎全站查询
  • 查询移动网站权重数据
  • 海外主机 台湾公司直销
  • Yii

    当前位置:主页 > 网络编程 > Yii >

    关于PHP条件运算符遇到的一个问题及解决方法

    时间:2019-10-09|栏目:Yii|点击:
  • 这篇文章主要介绍了关于关于PHP条件运算符遇到的一个问题及解决方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    今天遇到一个关于PHP 嵌套使用条件运算符(ternary expressions)的问题

    现象

    先来看一段C语言代码(test.c):

    #include<stdio.h> int main() { int x = 1; int shit = x == 1 ? 100 : x == 2 ? 200 : 300; printf("shit的值:%d\n", shit); return 0; }

    编译后运行一下

    root$ gcc test.c -o test && ./test shit的值:100

    答案在意料之中,因为x==1,所以100被赋值给shit。

    但是如果我们用PHP重写一下上文的代码(test.php):

    <?php $x = 1; $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300; echo "shit的值:$shit\n";

    执行一下:

    root$ php test.php shit的值:200

    我们发现返回的结果不一样了,这是为什么呢?

    排查

    首先怀疑可能是PHP中比较运算符(==)和条件运算符(?:)的优先级问题,我们查看一下PHP官方文档

    关于PHP条件运算符遇到的一个问题及解决方法

    ==的优先级比?:更高(C语言也是这样),所以

    $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300;

    等效于

    $shit = ($x == 1) ? 100 : ($x == 2) ? 200 : 300;

    执行一遍也确实如此,可以排除掉是运算符优先级导致问题的可能性了。

    但是官方文档里关于运算符结合方向的举例说明中出现了这么一句话:

    9069665-931be7d059d61930[1].png

    这跟上文描述的现象很相似,问题应该就在这了。一番查阅之后得到以下结论:

    结论

    C语言的条件运算符(?:)的结合方向是从右往左,每次求值都是从最右边的子表达式开始算起,所以

    int x = 1; int shit = x == 1 ? 100 : x == 2 ? 200 : 300; //等效于 int shit = x == 1 ? 100 : (x == 2 ? 200 : 300); //等效于 int shit = x == 1 ? 100 : (300);// 100

    PHP的条件运算符(?:)的结合方向是从左往右,每次求值都是从最左边的子表达式开始算起,所以

    $x = 1; $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300; //等效于 $shit = ($x == 1 ? 100 : $x == 2) ? 200 : 300; //等效于 $shit = (100) ? 200 : 300;// 200

    介于PHP的条件运算符结合方向,我们无法像C/C++那样 通过嵌套条件运算符来达到if-elseif-elseif-else表达式的效果,除非我们在靠后的子表达式中加上括号,本例中就可以靠这种方式解决:

    $shit = $x == 1 ? 100 : ($x == 2 ? 200 : 300);

    但在条件分支较多的情况下,就会出现代码可读性问题(堆积括号):

    $shit = $x == 1 ? 100 : ($x == 2 ? 200 : ($x== 3 ? 300 : ... ($x == 8 ? 800 : 900)))))));

    由于PHP不堆积括号的写法与C/C++在执行结果上是不一致的,并且只能通过加括号改变默认的结合方向 以达到预期的结果,所以PHP文档里干脆不建议嵌套使用条件运算符:

    Note:
    It is recommended that you avoid "stacking" ternary expressions. PHP's
    behaviour when using more than one ternary operator within a single statement is non-obvious

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    聊聊框架开发的依赖注入,容器与外观模式(下部)

    如何解决PHP的高并发和大流量的问题

    以上就是关于PHP条件运算符遇到的一个问题及解决方法的详细内容,更多请关注php中文网其它相关文章!

    上一篇:聊聊框架开发的依赖注入,容器与外观模式(下部)

    栏    目:Yii

    下一篇:对于PHP的Laravel定时任务Schedule的分析

    本文标题:关于PHP条件运算符遇到的一个问题及解决方法

    本文地址:http://www.jh-floor.com/wangluobiancheng/Yii/86079.html

    广告投放 | 联系我们 | 版权申明

    重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

    如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

    联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

    Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号