为什么PHP会产生意外的输出?

时间:2015-07-03 15:59:27

标签: c# php conditional

$i = 2;
$result = ($i == 2) ? "Two" : ($i == 1) ? "One" : "Other";

echo $result; // outputs: One

虽然C#输出中的代码相同:两个

int i=2;
String result = (i == 2) ? "Two" : (i == 1) ? "One" : "Other" ;
Console.Write( result ); // outputs: Two

3 个答案:

答案 0 :(得分:5)

评估三元运算符 LEFT-TO-RIGHT

($i == 2) ? "Two" : ($i == 1) ? "One" : "Other"
"Two" ? "One" : "Other"  // first part evaluated to "Two"
"One"                    // non-empty strings evaluate to true

因此,您应该在输出中获得One,而不是Other。这有点棘手。

来自manual

的明智话语
  

建议您避免“堆叠”三元表达式。 PHP在单个语句中使用多个三元运算符时的行为是不明显的。

答案 1 :(得分:2)

@light已经提供了解释,但为了获得您想要的结果,您需要额外的大括号:

$i = 3;
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other");
echo $result, PHP_EOL;

$i = 2;
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other");
echo $result, PHP_EOL;

$i = 1;
$result = ($i == 2) ? "Two" : (($i == 1) ? "One" : "Other");
echo $result, PHP_EOL;

Demo

答案 2 :(得分:0)

这是因为C#是强类型的,并且需要一个布尔值作为三元运算符的第一个参数,而PHP是松散类型的,基本上每个值都可以转换为它的布尔等效值。此外,三元运算符从左到右进行评估。这是什么意思?

在C#中,我们需要在运算符的最左侧使用布尔值,所以这个表达式为:

String result = (i == 2) ? "Two" : (i == 1) ? "One" : "Other" ;

将按此顺序进行评估:

String result = (i == 2) ? "Two" : ((i == 1) ? "One" : "Other");

i==2等于true,因此"Two"将被指定为最终结果。在PHP中它看起来有点不同。我们可以解释这个表达式:

$result = ($i == 2) ? "Two" : ($i == 1) ? "One" : "Other";
像这样

$result = (($i == 2) ? "Two" : ($i == 1)) ? "One" : "Other";

$i等于2,因此值"Two"将是第一个表达式的结果。 PHP中的非空字符串值等于true,因此" One"将是最终结果。