对包含匿名函数的数组使用 php 空安全和空合并运算符
Using php null safe and null coalescing operators with an array containing anonymous functions
以下代码按预期工作:
$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";
您的尝试是在调用函数的结果 上使用空合并运算符。所以它不会阻止未定义的数组索引或调用结果的空函数。
Future Scope
...
A nullsafe function call syntax ($callableOrNull?()) is also outside of scope for this RFC.
所以这是将来可能会解决的问题,但它不在现有设计中。
以下代码按预期工作:
$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";
您的尝试是在调用函数的结果 上使用空合并运算符。所以它不会阻止未定义的数组索引或调用结果的空函数。
Future Scope
...
A nullsafe function call syntax ($callableOrNull?()) is also outside of scope for this RFC.
所以这是将来可能会解决的问题,但它不在现有设计中。