Используйте затворы в спичечных дужках

Когда я запускаю следующий код, где condition_2 является результатом совпадения, содержимое $foo является экземпляром замыкания, но мне нужен результат, который должен быть возвращен этим замыканием. Как ты это делаешь? condition_1 работает как положено.

$foo = match ($conditions) {
    'condition_1' => 'some text',
    'condition_2' => function () {
        $result = '';
        // crazy programming
        return $result;
    }
}

person Niwo    schedule 08.05.2021    source источник


Ответы (1)


Просто оберните замыкание в call_user_func:

$conditions = 'condition_2';
$foo = match ($conditions) {
    'condition_1' => 'some text',
    'condition_2' => call_user_func(function () {
        $result = 'crazy';
        // crazy programming
        return $result;
    })
};
var_dump($foo);

Этот код приведет к выводу string(5) "crazy".

В качестве альтернативы вы можете сохранить свое закрытие в переменной и просто вызвать его:

$myCallback = function () {
    $result = 'crazy';
    // crazy programming
    return $result;
};
$conditions = 'condition_2';
$foo = match ($conditions) {
    'condition_1' => 'some text',
    'condition_2' => $myCallback()
};

Существует третий способ сделать это, когда вы можете немедленно вызвать закрытие, если добавите дополнительные наборы скобок (кончик шляпы для IMSoP за указание на это в комментариях):

'condition_2' => (function () {
    $result = 'crazy';
    // crazy programming
    return $result;
})()

Первый набор оборачивает замыкание и позволяет интерпретировать его (...closure definition...), а второй — пустой набор, обозначающий вызов функции: wrapper -->(...closure definition...)()<-- call. Может быть, немного менее читабельно, но устраняет любых посредников (промежуточную переменную или вызов другой функции).

person El_Vanja    schedule 08.05.2021
comment
Живое тестирование для первого решения и альтернативный. - person El_Vanja; 08.05.2021
comment
На самом деле вы можете выполнить замыкание напрямую без call_user_func или промежуточной переменной, но в итоге вы получите довольно много разных скобок: 3v4l.org/gWS2j - person IMSoP; 10.05.2021