PHP7:如何对空变量使用问号(??运算符)

时间:2019-01-07 17:37:02

标签: php php-7

请检查此代码:

$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;

1 个答案:

答案 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生成代码。