在其他答案中没有看到任何关于为什么您的代码被破坏的解释,所以这里有一个快速的总结。
这里的问题更明显的是你添加了括号以使评估的隐含顺序更加明确。
这是您的代码的精简版本,它仍然会产生“马”的错误结果:
$t = 'T';
( $t == 'T' ) ? 'train' :
( $t == 'C' ) ? 'car' :
( $t == 'H' ) ? 'horse' : 'feet';
首先,让我们展开它:
( $t == 'T' ) ? 'train' : ( $t == 'C' ) ? 'car' : ( $t == 'H' ) ? 'horse' : 'feet';
接下来,我将在已经存在隐式括号的地方添加显式括号:
((($t == 'T') ? 'train' : ($t == 'C')) ? 'car' : ($t == 'H')) ? 'horse' : 'feet';
接下来,我们可以解决您的比较:
((true ? 'train' : false) ? 'car' : false) ? 'horse' : 'feet';
您应该开始了解为什么会出现这种情况。第一个三元计算true ? 'train' : 'false'
为'train'
:
('train' ? 'car' : false) ? 'horse' : 'feet';
因为'train'
当转换为布尔值时为真,所以现在的结果是'car'
:
'car' ? 'horse' : 'feet';
同样,因为非空字符串是“真”,所以结果现在是“马”。因此,当 a 第一次true
出现在你可怕的嵌套 case 语句中时,结果将级联所有剩余的语句,为下一个运算符的“true”分支抛出先前的值。
解决方案是避免使用此代码。这是一种过于聪明的尝试,结果是一个破碎的、难以理解的混乱。绝对没有理由使用它。选择一个switch
声明,它是专为您想要做的事情而设计的。