簡體   English   中英

將 php null 安全和 null 合並運算符與包含匿名函數的數組一起使用

[英]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";

您的嘗試是在調用函數的結果上使用空合並運算符。 所以它不會阻止未定義的數組索引或調用結果的空函數。

來自Nullsafe Operator RFC

未來范圍
...
空安全函數調用語法 ($callableOrNull?()) 也在本 RFC 的范圍之外。

因此,這可能會在未來解決,但不在現有設計中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM