PHP三元组!空而不是评估为true或false

时间:2011-11-07 11:09:59

标签: php ternary-operator

是否可以使用简写三元来检查变量是否设置,而不是是否计算为零或非零?

例如,我尝试过:

$var = 0;
echo (string) $var ?: (string) false ?: 2;

但由于前两个表达式都评估为“0”或“false”,因此显示2。

我认为将它们投射到字符串会产生不同的结果,但事实并非如此。我认为零是零。

我想在分配

等变量时使用这种风格
$get->var = $get->var ?: $setindb ?: $default;

如果已设置,我想将$ get-> var分配给$ get-> var,否则,检查db是否有值,否则使用默认值。

修改

我想我会提到我知道我可以做类似

的事情
$get->var = (!empty($get->var)) ? $get->var : ( (!empty($setindb)) ? $setindb : $default )

但你是一个更简单的判断:)

1 个答案:

答案 0 :(得分:2)

字符串“0”和“false”在PHP中被视为FALSE - y(list of false values)值。

对于已设置且不是isset()的变量,

TRUE会返回NULLempty()将检查变量是否已设置且不是FALSE值。所以它会返回TRUE为“0”。

我认为您想要的是您的第三个代码段,但使用的是isset(),而不是empty()

最简单的方法(使用最少的括号):

$get->var = isset($get->var) ? $get->var : (isset($setindb) ? $setindb : $default);

由于速记tenary返回第一个参数,你不能使用它,因为那将是一个布尔值。 (isset($get->var) ?: $default会返回TRUEFALSE$default,但不会返回$get->var的值。)


编辑:也许你喜欢像聚结功能这样的东西?据我所知,PHP本身并不提供它,但创建起来却微不足道。请注意,这可能有点难看,因为它使用了对函数的传递引用。我对这方面的评论感兴趣(它是否像我认为的那样糟糕?)。

function coalesce(array $values)
{
    foreach($values as &$value)
    {
        if(isset($value))
            return $value;
    }
    return null;
}
$this->var = coalesce(array(&$this->var, &$setindb, $default));

我没有测试过上面的内容。将数组中的变量作为引用传递(&符号)。我很确定它会像coalesce(array(1,"a_string",false));那样窒息。