文章目录
  1. 1. 简述
  2. 2. 问题
  3. 3. 结果
  4. 4. 后语

简述

今天同事在堆积(嵌套)使用PHP的三元运算表达式时发现与预期的不同, 在此之前一直没对PHP的三元表达式堆积使用过, 感觉逻辑及结构表达不够清晰, 特意去查了一下PHP官方文档.

问题

1
echo (true ? 'true' : false ? 't' : 'f');

上面的这段代码乍看起来结果输出的是 true(string) , 然而实际输出的是 t(string).

PHP官方文档里是这样说的

建议避免将三元运算符堆积在一起使用。当在一条语句中使用多个三元运算符时会造成 PHP 运算结果不明显:因为三元运算符是从左往右计算的
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: this is because ternary expressions are evaluated from left to right

结果

由于PHP的三元运算表达式是由左往右运算的, 所以上面那段代码实际的运算顺序是这样的

1
echo ((true ? 'true' : false) ? 't' : 'f');

所以最终输出的结果应该是 t(string)

如PHP官方文档所说, 三元运算符堆积使用会使代码逻辑结构不清晰, 运算预期可能会有出入, 三元运算符应尽量不堆积使用.
如必需堆积使用, 应尽量使用 () 小括号 来清晰的表达出语句的结构.

后语

其它语言如 javascript 的运算结果与 PHP 的逻辑不同, 结果如所预期那样

1
console.log(true ? 'true' : false ? 't' : 'f');

输出结果为 true(string)

文章目录
  1. 1. 简述
  2. 2. 问题
  3. 3. 结果
  4. 4. 后语