请检查此代码:
$title1 = null; // maybe isset or not
$title2 = 'title2'; // maybe isset or not
$title3 = null; // maybe isset or not
$title = $title1 ?? $title2 ?? $title3;
我要打印非空变量的值。
在此示例中,
echo $title;
我希望它显示$title2
的值,但它显示$title1
的值。
我可以用switch
中的if
来做,但是我可以用??
方法来做吗?
if(isset($title1) && $title1)
$title = $title1;
elseif(isset($title2) && $title2)
$title = $title2;
elseif(isset($title3) && $title3)
$title = $title3;
答案 0 :(得分:1)
您的代码绝对正确,应该可以正常工作,输出'title2'
。
但是,您的条件isset($title1) && $title1
不相同。这类似于'Elvis'运算符?:
检查是否为布尔值,只是Elvis运算符始终返回一个值(可能为null)并在未定义的操作数上发出通知。您必须通过@
运算符将其静音。
您的if-else-construct几乎等同于
$title = @$title1 ?: @$title2 ?: @$title3;
唯一的区别是,$title
始终是在此处分配的,而当所有操作数都被赋值为false时,在if-else-construct $title
中保持不变。
请注意,@
运算符的静音也可以防止显示严重错误,例如使用函数作为操作数时。
另一种方法是定义自己的功能。按值的参数也会对未设置的变量发出提示,但是按引用的参数则不会。您可以使用参考来设计可变参数函数:
function firstNonEmpty(&...$variableRefs)
{
$v = null; // ensure declaration since loop might not interate at all
foreach ($variableRefs as $v)
if($v) break;
return $v ?: null; // we want null even if last value is like false
}
$c = 'value not considered to be empty';
$v = firstNonEmpty($a, $b, $c, $d);
引用引用的参数不接受文字,因此将某些参数附加为默认参数将不起作用。但是,在这种情况下,您可以简单地使用null换行符??
。几乎没有用例可以添加多个默认文字,因为您在开发时就知道文字是否评估为false。
$v = firstNonEmpty($a, $b, $c, $d, 'default') ; // does NOT work
$v = firstNonEmpty($a, $b, $c, $d) ?? 'default'; // DOES work
// One strange thing of PHP is that
$v = firstNonEmpty($a, ...[0, null, '', 'non-empty']); // DOES work as well
后者从字面上创建了一个字面量数组,并引用了被破坏的项目。唯一可以想到的具有多个文字的用例将由eval
生成代码。