PHP7: 如何对空变量使用问号(?? 运算符)
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 运算符总是 returns 一个值(可能为空)并在未定义的操作数上发出通知。您必须通过 @
运算符将其静音。
你的 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);
引用参数不接受文字,因此附加一些作为默认参数将不起作用。但是,在这种情况下,您可以简单地使用空合并运算符 ??
。几乎没有添加多个默认文字的用例,因为您在开发时就知道文字评估是否为 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
.
生成的代码
请检查此代码:
$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 运算符总是 returns 一个值(可能为空)并在未定义的操作数上发出通知。您必须通过 @
运算符将其静音。
你的 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);
引用参数不接受文字,因此附加一些作为默认参数将不起作用。但是,在这种情况下,您可以简单地使用空合并运算符 ??
。几乎没有添加多个默认文字的用例,因为您在开发时就知道文字评估是否为 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
.