问题描述
以下代码按预期工作:
$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,'addd'));
如果我更新代码:
return $actions[$action] ?? "Action forbidden";
然后它按预期工作:
// 3) string(16) "Action forbidden"
var_dump(calculate(1,'addd'));
当然,如果我这样更新代码:
return array_key_exists($action,$actions) ? $actions[$action]($num1,$num2) : "Action forbidden";
// 4) string(16) "Action forbidden"
var_dump(calculate(1,'addd'));
但它失去了空合并的所有好处......
问题
为什么我不能使用以下格式的空合并(或者我缺少什么?):
return $actions[$action]($num1,$num2) ?? "Action forbidden";
解决方法
您的尝试是在调用函数的结果上使用空合并运算符。所以它不会阻止未定义的数组索引或调用结果的空函数。
未来范围
...
空安全函数调用语法 ($callableOrNull?()) 也在此 RFC 的范围之外。
所以这可能在未来解决,但不在现有设计中。