PHP三元运算符不能按预期工作?

时间:2018-09-15 16:34:34

标签: php operators ternary-operator

我有一个检查param是否为null的方法,但是如果我使用三元运算符来确保错误的结果不是字符串,则不会得到相同的预期结果...每天都有一个完整的堆栈.NET开发人员,但是做一些PHP自由职业者,这真让我感到难过...

$param = null;

// $active evaluates to true
$active = is_null($param) ? true : false;

// $active evaluates to false
$active = is_null($param) ? true : is_string($param)
    ? (strtolower($param) === 'true')
    : true;

我在C#和JavaScript中使用了嵌套三元运算符,这感觉无数次,但是我不知道我是否曾经在PHP中尝试过... PHP是否会在表示结果之前尝试评估所有嵌套三元运算符或在这里我缺少什么东西,因为从我的理解中,三元运算符应该短路,并且在两种情况下都应评估为真。

3 个答案:

答案 0 :(得分:3)

与大多数其他语言(例如C#)不同,ternary operator保持关联性。代码:

$active = is_null($param)
    ? true
    : is_string($param)
        ? (strtolower($param) === 'true')
        : true;

评估如下:

$active = ((is_null($param) ? true : is_string($param))
                                                        ? (strtolower($param) === 'true') : true);

您必须显式添加括号以确保?:能够像在熟悉的语言中那样工作:

$active = is_null($param)
    ? true
    : (is_string($param)
        ? (strtolower($param) === 'true')
        : true);

答案 1 :(得分:2)

您需要用括号()包装第二个三元条件,

<?php
$param = null;
// $active evaluates to true
$active = is_null($param) ? true : false;
echo "Simple ternary result = $active".PHP_EOL;
// $active evaluates to true
$active = is_null($param) ? true : (is_string($param)? (strtolower($param) === 'true'): true);
echo "Nested ternary result = $active";
?>

注意:

  

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

http://php.net/manual/en/language.operators.comparison.php此处查看示例4,

示例#4非显而易见的三元行为

<?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.
?>

演示: https://3v4l.org/gW8pk

答案 2 :(得分:0)

这是PHP的一个众所周知的问题。我怀疑它是否会解决。使用括号或if..elseswitch语句来获取所需的行为。

(从技术上讲,PHP中的三元运算符是“左关联”,而在使用该运算符的所有其他语言中,则是“右关联”。后者是该运算符的更逻辑的行为。)