Closure :: fromCallable用于导入函数

时间:2018-11-02 11:33:08

标签: php php-7.1 php-7.2

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

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

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

TypeError:无法从可调用的对象创建封包:找不到函数“ pick”或无效的函数名

示例代码:

use function Functional\pick;

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

1 个答案:

答案 0 :(得分:3)

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); });

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

编辑:在this recent thread中的php-externals中对此进行了一些体面的讨论