是否可以从闭包创建一个命名函数?

Ber*_*ers 15 php

在PHP中,您可以使用以下命名函数:

function foo()
{
   return "bar";
}
Run Code Online (Sandbox Code Playgroud)

你可以有这样的闭包:

$foo = function() {
    return "bar";
};
Run Code Online (Sandbox Code Playgroud)

闭包非常棒且易于创建,但遗憾的是我需要使用的库真的需要一个命名函数.是否可以动态地从闭包创建命名函数?即不提前在代码中定义所有函数,但更像是register_function($name, callable $closure).

我知道create_function,但是那个将PHP字符串作为函数体并且只是eval它,这不是我正在寻找的.

ven*_*uil 8

您可以使用回调创建全局数组.添加到此全局数组register_func($name, $callback)并通过调用函数call_func($name, $parameter1, $parameter2, ...).

没有使用eval我认为这不可能从回调创建命名函数.


rev*_*evo 2

我不认为是否可以动态地从闭包中创建命名函数,但使用__call()类的魔术方法,您可能会发现此解决方法很有帮助:

<?php

class Foo
{
    public function __call($name, $args)
    {
        if (isset($this->{$name}))
            return call_user_func_array($this->{$name}, $args);
    }
}

$foo = new Foo();
// Declaring a closure then assign it to $bar property of Foo
$foo->bar = function () { 
    echo "bar"; 
};
// Call Foo method of the same name
$foo->bar();
Run Code Online (Sandbox Code Playgroud)