对包含匿名函数的数组使用php空安全和空合并操作符



以下代码按预期工作:

$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的范围之内。

所以这是将来可能会解决的问题,但它不在现有的设计中。

最新更新