PHP 三目运算符问题


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

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

阅读 5.5k
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;

纠结这种运算符优先级的问题没什么意义,看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 ;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题