[英]PHP7: how to use question marks(?? operator) for empty variable
请检查以下代码:
$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
值。
我可以用if
switch
来做,但是我可以用??
方法?
if(isset($title1) && $title1)
$title = $title1;
elseif(isset($title2) && $title2)
$title = $title2;
elseif(isset($title3) && $title3)
$title = $title3;
您的代码绝对正确,应该可以正常工作,输出'title2'
。
但是,您的条件isset($title1) && $title1
是不同的。 这更像是'Elvis'操作符?:
检查是否为布尔值,只是Elvis操作符总是返回一个值(可能为null)并在未定义的操作数上发出提示。 您必须使用@
运算符将其静音。
您的if-else-construct几乎等同于
$title = @$title1 ?: @$title2 ?: @$title3;
唯一的区别是,无论如何,这里都分配了$title
,而在if-else-construct中,当所有操作数的值为false时, $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-coalescing运算符??
在这种情况下。 几乎没有用例可以添加多个默认文字,因为您在开发时就知道文字是否评估为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
生成代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.