PHP 三目运算符问题
PHP中文网
PHP中文网 2017-04-10 18:08:51
[PHP讨论组]

    $a = 1;
    echo $a == 1 ? 2 : $a == 1 ? 3 : 4 ;

这段代码的输出为什么是 3 呢? 同样的三目运算符级联,用 JavaScript 写结果就是 2...

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(4)
黄舟

哎,这个是PHP的三目运算符比较特殊:

  • PHP的?:是从左到右结合的: $a == 1 ? 2 : $a == 1 ? 3 : 4 等价于 ($a == 1 ? 2 : $a == 1) ? 3 : 4

  • JavaScript的?:是从右到左结合的: $a == 1 ? 2 : $a == 1 ? 3 : 4 等价于 $a == 1 ? 2 : ($a == 1 ? 3 : 4)

所以呢,多加点括号吧。反正多加括号一般不会有什么影响。

参考:

  1. PHP 运算符优先级

  2. 运算符优先级 - JavaScript - MDN

看看常见语言的?:三目运算符的结合顺序:(就PHP奇葩)

  • C: 从右到左

  • C++: 从右到左

  • Java: 从右到左

  • PHP: 从左到右

  • JavaScript: 从右到左

  • C#: 从右到左

  • Object-C: 从右到左

  • Swift: 从右到左

黄舟

这是2个三目运算的合体

$a == 1 ? 2 : $a == 1 ? 3 : 4 ;
$a == 1 ? 2 : $a == 1 这是第一段三目值是2
2 ? 3:4 结果就是3;

ringa_lee

纠结这种运算符优先级的问题没什么意义,看manual就知道了 Operator Precedence

由于==的优先级最高,所以
$a == 1 ? 2 : $a == 1 ? 3 : 4等同于true ? 2 : true ? 3 : 4

由于?:是左结合的
所以true ? 2 : true ? 3 : 4等同于(true ? 2 : true) ? 3 : 4

同理, javascript中?:是右结合的

黄舟

基础的运算符优先级RTFM

相同的运算符优先级,运算符? :的结合方向是左,所以整个运算式从左依次运算,相当于

($a == 1 ? 2 : $a == 1) ? 3 : 4 ;

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号