如何评估以下脚本?

时间:2014-09-25 11:05:53

标签: php logic

<?php echo true?'what':true?'will':'print?';?>  

以上代码输出will 我无法掌握它背后的逻辑。任何人都可以解释它。

提前致谢。

4 个答案:

答案 0 :(得分:2)

您应该使用大括号:

echo true?'what':(true?'will':'print?'); 

这将输出what。如果没有大括号,第二个如果覆盖第一个。因为三元表达式从左到右解释。因此,如果您没有设置任何大括号,PHP解释器会将您的语句解释为:

echo (true?'what':true)?'will':'print?'; 

According to PHP.net您应避免堆叠三元表达式:

  

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

答案 1 :(得分:2)

来自documentation

  

注意:

     

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

     

示例#4非明显的三元行为         

//然而,上面的实际输出是't'   // 这是因为从左到右评估三元表达式

     

//以下是与上述相同代码的更明显版本    echo((true?'true':false)?'t':'f');

     

//在这里,您可以看到第一个表达式被评估为'true',即   //反过来评估为(bool)true,从而返回真正的分支   //第二个三元表达。

答案 2 :(得分:1)

PHP中的三元运算符是左关联的。您的代码评估如下:

echo (true ? 'what' : true) ? 'will' : 'print?';

这相当于:

echo (true) ? 'will' : 'print?';

因此,结果将是&#39;将&#39;。您应该使用以下内容:

echo true ? 'what' : (true ? 'will' : 'print?');

可在此处找到相关帖子:Why is the output of `echo true ? 'a' : true ? 'b' : 'c';` 'b'?

答案 3 :(得分:1)

建议您避免“堆叠”三元表达式。 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.

`