PHP多个三值运算符未按预期工作

PHP多个三值运算符未按预期工作,php,ternary-operator,Php,Ternary Operator,为什么要打印2 echo true ? 1 : true ? 2 : 3; 据我所知,它应该打印1 为什么它不能按预期工作?因为您所写的内容与以下内容相同: echo (true ? 1 : true) ? 2 : 3; 如您所知,1的计算结果为true 你所期望的是: echo (true) ? 1 : (true ? 2 : 3); 所以一定要用大括号来避免这种混淆 如前所述,三元表达式在PHP中是左关联的。这意味着首先将从左开始执行第一个,然后执行第二个,依此类推。如有疑问,请使用括

为什么要打印
2

echo true ? 1 : true ? 2 : 3;
据我所知,它应该打印
1


为什么它不能按预期工作?

因为您所写的内容与以下内容相同:

echo (true ? 1 : true) ? 2 : 3;
如您所知,1的计算结果为
true

你所期望的是:

echo (true) ? 1 : (true ? 2 : 3);
所以一定要用大括号来避免这种混淆


如前所述,三元表达式在PHP中是左关联的。这意味着首先将从左开始执行第一个,然后执行第二个,依此类推。

如有疑问,请使用括号


与其他语言相比,PHP中的三元运算符是左关联的,不能按预期工作。

用括号分隔第二个三元子句

echo true ? 1 : (true ? 2 : 3);

示例#3不明显的三元行为

<代码> > p>在您的情况下,应考虑执行语句的优先级。

使用以下代码:

echo true ? 1 : (true ? 2 : 3);
比如说,

$a = 2;
$b = 1;
$c = 0;

$result1 = $a ** $b * $c;
// is not equal
$result2 = $a ** ($b * $c);

你在数学表达式中用过括号吗然后,根据执行优先级,结果是不同的。在您的例子中,三元运算符没有优先级。让解释器了解使用括号执行操作的顺序。

很晚了,但这是一个很好的例子,说明从现在开始要小心:

echo true ? 1 : (true ? 2 : 3);
$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

PHP7.3.1(Windows命令行)的结果。我不明白他们为什么要更改它,因为如果我尝试更改它,代码将变得真的不可读。

从来没有好的理由嵌套三元运算符。。。手册明确警告您注意这一点-
注意:建议您避免“堆叠”三元表达式。PHP在一条语句中使用多个三元运算符时的行为不明显
-三元表达式是左关联的。如果必须嵌套三元运算符,请在其周围使用括号。事实上,我还是建议用括号括起来;即使没有嵌套它们,也会使它们更具可读性。