Closure :: fromCallable для импортируемой функции - PullRequest
0 голосов
/ 02 ноября 2018

Я играю на PHP и немного программирую в функциональном стиле.

Я использую Функциональную библиотеку PHP , но вопрос является общим для PHP (я использую 7.2).

Я пытаюсь создать вызываемый объект из импортированной функции, но получаю

TypeError: не удалось создать замыкание из вызываемого объекта: функция 'pick' не найдена или недопустимое имя функции

Пример кода:

use function Functional\pick;

class A
{
    public function execute()
    {
        $pick1 = \Closure::fromCallable('pick');
    }
}

1 Ответ

0 голосов
/ 02 ноября 2018

PHP use операторы определяют псевдоним для остальной части файла, но они не влияют на строку, ссылающуюся на импортированную функцию или класс.

Когда вы говорите

use function Functional\pick;

это означает, что в этом файле вы можете вызвать функцию Functional\pick, просто используя pick(...). Но если вы используете строку для ссылки на нее, тогда PHP не знает, как расширить псевдоним.

Самый быстрый способ решить эту проблему - просто использовать полное имя функции при вызове fromCallable:

$pick1 = \Closure::fromCallable('Functional\pick');
echo get_class($pick1);

Закрытие

В качестве альтернативы, если вы действительно хотите использовать псевдоним, вы можете обернуть вызов на уровень глубже с помощью другой анонимной функции:

use function Functional\pick;

$pick1 = \Closure::fromCallable(function (...$args) { return pick(...$args); });

Но это, по-моему, намного сложнее, по крайней мере.

Редактировать: В этой недавней теме в php-externals

есть несколько приличных обсуждений
...