PHP三元运算表达式堆积使用后的运算逻辑
简述
今天同事在堆积(嵌套)使用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)