为什么要打印2
?
echo true ? 1 : true ? 2 : 3;
根据我的理解,它应该打印1
。
为什么它没有按预期工作?
答案 0 :(得分:25)
因为你所写的内容与:
相同echo (true ? 1 : true) ? 2 : 3;
如您所知,1被评估为true
。
您的期望是:
echo (true) ? 1 : (true ? 2 : 3);
所以总是使用大括号来避免这种混淆。
如前所述,三元表达式在PHP中是左对联的。这意味着首先将从 left 执行第一个,然后执行第二个,依此类推。
答案 1 :(得分:3)
如有疑问,请使用括号。
与其他语言相比,PHP中的三元运算符是左关联的,并且不能按预期工作。
答案 2 :(得分:3)
用括号分隔第二个三元句。
echo true ? 1 : (true ? 2 : 3);
答案 3 :(得分:2)
Example #3 Non-obvious Ternary Behaviour
<?php
// on first glance, the following appears to output 'true'
echo (true?'true':false?'t':'f');
// however, the actual output of the above is 't'
// this is because ternary expressions are evaluated from left to right
// the following is a more obvious version of the same code as above
echo ((true ? 'true' : false) ? 't' : 'f');
// here, you can see that the first expression is evaluated to 'true', which
// in turn evaluates to (bool)true, thus returning the true branch of the
// second ternary expression.
?>
答案 4 :(得分:0)
在这种情况下,您应该考虑执行语句的优先级。
使用以下代码:
echo true ? 1 : (true ? 2 : 3);
例如,
$a = 2;
$b = 1;
$c = 0;
$result1 = $a ** $b * $c;
// is not equal
$result2 = $a ** ($b * $c);
您是否在数学表达式中使用了括号? -然后,根据执行优先级,结果是不同的。在您的情况下,三元运算符的编写没有优先级。让解释器了解使用括号按什么顺序执行操作。
答案 5 :(得分:0)
晚了,但从现在开始是一个很好的例子:
$x = 99;
print ($x === 1) ? 1
: ($x === 2) ? 2
: ($x === 3) ? 3
: ($x === 4) ? 4
: ($x === 5) ? 5
: ($x === 99) ? 'found'
: ($x === 6) ? 6
: 'not found';
// prints out: 6
PHP 7.3.1(Windows命令行)的结果。我不明白,为什么他们要更改它,因为如果我尝试更改此代码,代码将变得非常不可读。