PHP三元!空,而不是计算为true或false

PHP三元!空,而不是计算为true或false,php,ternary-operator,Php,Ternary Operator,是否可以使用速记三元来检查变量是否已设置,而不是是否计算为零或非零 例如,我尝试: $var = 0; echo (string) $var ?: (string) false ?: 2; 但由于前两个表达式的计算结果均为“0”或“false”,因此将显示2 我认为,也许把它们串在一起会产生不同的结果,但事实并非如此。我想零就是零 我希望在分配变量时使用这种样式,例如 $get->var = $get->var ?: $setindb ?: $default; 如果设置了$get

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

例如,我尝试:

$var = 0;
echo (string) $var ?: (string) false ?: 2;
但由于前两个表达式的计算结果均为“0”或“false”,因此将显示2

我认为,也许把它们串在一起会产生不同的结果,但事实并非如此。我想零就是零

我希望在分配变量时使用这种样式,例如

$get->var = $get->var ?: $setindb ?: $default;
如果设置了$get->var,我想将$get->var分配给$get->var,否则,检查db是否有值,否则,使用默认值

编辑 我想我会说我知道我可以做类似的事情

$get->var = (!empty($get->var)) ? $get->var : ( (!empty($setindb)) ? $setindb : $default )
但是你可以判断哪个更简单:)

字符串“0”和“false”在PHP中被认为是
false
-y()值

isset()
为已设置且不为
NULL
的变量返回
TRUE
empty()
将检查变量是否已设置且不是
FALSE
值。因此,对于“0”,它将返回
TRUE

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

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

$get->var = isset($get->var) ? $get->var : (isset($setindb) ? $setindb : $default);
因为速记十进制返回第一个参数,所以不能使用它,因为这将是一个布尔值。(
isset($get->var):$default
将返回
TRUE
FALSE
$default
,但决不会返回
$get->var
的值。)


编辑:也许你想要一个类似于合并函数的东西?据我所知,PHP并没有以本机方式提供它,但它的创建非常简单。请注意,这可能有点难看,因为它使用了向函数传递引用。我对这件事的评论感兴趣(这和我想的一样糟糕吗?)


我还没有测试过上面的内容。将数组中的变量作为引用传递(
&
符号)。我很确定它会被类似于
coalesce(数组(1,“a_字符串”,false))的东西阻塞

为什么不改用isset($get->var)呢?好吧,在我上面的例子中,isset不是空的,而是更合适的,但这仍然使我处于相同的情况。我一直在寻找一种更简单的方法。好吧,我不知道除了真或假PHP7之外,是否有一些三元数可以检查的技巧(比如铸造)有一个coalesce操作符用??
function coalesce(array $values)
{
    foreach($values as &$value)
    {
        if(isset($value))
            return $value;
    }
    return null;
}
$this->var = coalesce(array(&$this->var, &$setindb, $default));