繁体   English   中英

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操作符总是返回一个值(可能为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM