以下代码按预期工作:
$array = [];
// null
var_dump($array['foo']->bar ?? null);
// this throws a warning
var_dump($array['foo']?->bar);
空合并操作符支持数组,而空安全操作符不支持。
,
让我们看下面的代码:
function calculate($num1, $num2, $action)
{
$actions = [
"add" => function ($a, $b) {
return $a + $b;
},
"substract" => function ($a, $b) {
return $a - $b;
},
"multiply" => function ($a, $b) {
return $a * $b;
},
"divide" => function ($a, $b) {
return $a / $b;
}
];
return $actions[$action]($num1, $num2) ?? "Action forbidden";
}
// 1) int(3)
var_dump(calculate(1, 2, 'add'));
// 2) Warning: Undefined array key "addd"...
var_dump(calculate(1, 2, 'addd'));
如果我用
更新代码return $actions[$action] ?? "Action forbidden";
然后按预期工作:
// 3) string(16) "Action forbidden"
var_dump(calculate(1, 2, 'addd'));
当然,如果我这样更新代码:
return array_key_exists($action, $actions) ? $actions[$action]($num1, $num2) : "Action forbidden";
// 4) string(16) "Action forbidden"
var_dump(calculate(1, 2, 'addd'));
但是它失去了空合并的所有好处…
为什么我不能对以下格式使用空合并(或者我遗漏了什么?):
return $actions[$action]($num1, $num2) ?? "Action forbidden";
您尝试在调用函数的结果上使用空合并运算符。因此,它不会阻止未定义的数组索引或调用null函数,结果。
来自Nullsafe操作符RFC
未来范围
…
nullsafe函数调用语法($callableOrNull?())也不在本RFC的范围之内。
所以这是将来可能会解决的问题,但它不在现有的设计中。