是否可以使用简写三元来检查变量是否设置,而不是是否计算为零或非零?
例如,我尝试过:
$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 )
但你是一个更简单的判断:)
答案 0 :(得分:2)
字符串“0”和“false”在PHP中被视为FALSE
- y(list of false values)值。
isset()
的变量, TRUE
会返回NULL
。 empty()
将检查变量是否已设置且不是FALSE
值。所以它会返回TRUE
为“0”。
我认为您想要的是您的第三个代码段,但使用的是isset()
,而不是empty()
。
最简单的方法(使用最少的括号):
$get->var = isset($get->var) ? $get->var : (isset($setindb) ? $setindb : $default);
由于速记tenary返回第一个参数,你不能使用它,因为那将是一个布尔值。 (isset($get->var) ?: $default
会返回TRUE
,FALSE
或$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));
那样窒息。