如何在PHP中连接多个三元运算符?
我经常使用三元运算符,但似乎无法将多个三元运算符堆叠在一起 我知道堆叠多个三值运算符将降低代码的可读性,但在某些情况下,我会这样做 我喜欢这样做 这就是我迄今为止所尝试的:如何在PHP中连接多个三元运算符?,php,ternary-operator,Php,Ternary Operator,我经常使用三元运算符,但似乎无法将多个三元运算符堆叠在一起 我知道堆叠多个三值运算符将降低代码的可读性,但在某些情况下,我会这样做 我喜欢这样做 这就是我迄今为止所尝试的: $foo = 1; $bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other"; echo $bar; // display 2 instead of 1 正确的语法是什么?在每个内部三元运算符周围加括号,这样可以确保运算符优先级: $bar = ( $foo ==
$foo = 1;
$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
echo $bar; // display 2 instead of 1
正确的语法是什么?在每个内部三元运算符周围加括号,这样可以确保运算符优先级:
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
这些括号就是我想让你明白的 试一试 添加括号:
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
你可以这样写:
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other");
(即:只需在括号中嵌入“内部”三元运算符。)
然而,我真的很想不这么做,因为它的可读性就像一个被严重弄脏的特别难以辨认的东西一样-从来没有任何借口可以混淆代码,这几乎就是它的边界。问题是,与所有其他语言不同,PHP使条件运算符左关联。这会破坏您的代码——在其他语言中也可以
您需要使用括号:
$bar = $foo == 1 ? "1" : ($foo == 2 ? "2" : "other");
(请注意,我已从代码中删除了其他括号;但这些括号是正确的,只是多余的。)您需要在右侧操作数周围添加一些括号:
$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;
PHP的解释器已损坏,并处理您的行:
$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
作为
由于左侧表达式的计算结果为“true”,因此将返回剩余三元运算符(“2”)的第一个操作数。只需将括号叠起来,即可得到:
$bar = ($foo==1? "1" : ($foo==2? "2" : "other"));
作为一个旁白,如果你有很多子句,你应该考虑使用<代码>开关<代码>:
switch ( $bar ) {
case 1: echo "1";
case 2: echo "2";
default: echo "other";
}
如果开关变长,可以将其包装在函数中
$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;
只需使用extra()就可以了“注意,我已经从代码中删除了其他括号;但是这些括号是正确的,只是多余的”-但是对于这样的解析器,您永远无法确定…;-)-1个坏了?解析器的行为完全符合PHPs运算符优先级和关联性概述的定义:@nikic PHP的手册记录了实现-文档没有定义实现,因为PHP从来没有正式的规范。与其他所有支持三元运算符的语言相比,实现是不完整的(即不同的)。如果你想说它与你习惯的语言不同,为什么不说它呢?@nikic我说的正是我想说的。任何明智的语言“设计”都会遵循C、C++、java等的先例。
switch ( $bar ) {
case 1: echo "1";
case 2: echo "2";
default: echo "other";
}
$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;