Closure::fromCallable 用于导入函数

Closure::fromCallable for imported function

我正在玩 PHP 和一些函数式编程。

我使用的是 Functional-PHP library 但问题是 PHP 的通用问题(我使用的是 7.2)。

我尝试从导入的函数创建一个可调用函数,但我得到的是

TypeError:无法从可调用函数创建闭包:函数 'pick' 未找到或函数名称无效

示例代码:

use function Functional\pick;

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

PHP use 语句定义文件其余部分的别名,但它们不会影响引用导入函数的字符串或 class.

当你说

use function Functional\pick;

这意味着在该文件中,您只需使用 pick(...) 即可调用 Functional\pick 函数。但是,如果您使用字符串来引用它,那么 PHP 不知道扩展别名。

解决此问题的最快方法是在调用 fromCallable 时使用完全限定的函数名称:

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

Closure

或者,如果你真的想使用别名,你可以用另一个匿名函数将调用包装得更深:

use function Functional\pick;

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

但这更混乱,至少在我看来是这样。

编辑: php-externals

中的 this recent thread 对此进行了一些不错的讨论