PHP-有没有办法将已定义的函数保存在变量中?

PHP-有没有办法将已定义的函数保存在变量中?,php,function,variables,callback,store,Php,Function,Variables,Callback,Store,我对谷歌不能真正帮助我的东西感兴趣 我知道在PHP中可以使用匿名函数,也可以将函数存储在变量中 $function = function myFoo() { echo "bar"; } 并使用变量调用它:$function() 到目前为止还不错,但如果我在某个地方声明了一个函数或方法,但没有在初始化时保存,该怎么办 我有一个函数需要一个可调用的,当然call\u user\u func()可以帮助我,但是我需要在回调处理程序中传递方法名,我认为这是非常不安全的,因为在我添加回调的那一刻,我不能

我对谷歌不能真正帮助我的东西感兴趣

我知道在PHP中可以使用匿名函数,也可以将函数存储在变量中

$function = function myFoo() { echo "bar"; }
并使用变量调用它:
$function()

到目前为止还不错,但如果我在某个地方声明了一个函数或方法,但没有在初始化时保存,该怎么办

我有一个函数需要一个可调用的,当然
call\u user\u func()
可以帮助我,但是我需要在回调处理程序中传递方法名,我认为这是非常不安全的,因为在我添加回调的那一刻,我不能说它是否真的是一个函数,在我存储它时是否存在

因此,我想实现以下几点:

此功能:

function anyFunction() {
    echo "doWhatever...!";
}
应在以后的时间点保存在变量中:

$myOtherFunction = get_registered_func("anyFunction"); 
我知道
get\u registered\u func()
不存在,但我想知道这是否可能

有了这个,我现在可以有另一个功能了

function setCallback(callable $theCallbackFunction) { }
然后像这样使用它:

setCallback($myOtherFunction);
这将有一个很大的优势,即当参数不是函数或不存在时抛出异常/致命错误


那么,简而言之,有没有一种方法可以将以前定义的、已经存在的函数或方法存储在变量中?

我看不出有什么理由不能这样做,除了没有PHP函数可以这样做。匿名函数语法是PHP中新引入的,如果它的边缘仍然有点粗糙,我也不会感到惊讶

您可以随时包装它:

function wrap_function ($callback) {
    if (is_callable($callback) === false) {
        throw new Exception("nope");
    }
    return function () {
        call_user_func($callback, func_get_args());
    }
}
$foo = new Foo();
$ref = wrap_function(array($foo, "bar"));
可以是:

  • 一串
  • 阵列
  • 匿名函数
只有后一个函数在某种程度上是“类型安全的”,也就是说,如果你得到一个匿名函数,你就知道它是可以调用的。其他两个选项只是形式化的非正式标准(如果有意义的话),由几个接受回调的函数支持;它们实际上不是PHP类型系统中的类型。因此,基本上不能保证你能做到


您只能通过检查您得到的
callable
是否可以在执行之前调用来解决这个问题。例如,您可以将其包装到自己的类中,以实际创建一个真正的可调用类型。

这不是一个好方法,但可能有助于您:

function foo($a) {
    echo $a;
}

$callFoo = 'foo';

$callFoo('Hello World!'); // prints Hello

当然,我知道它可以做我想做的事情,但这是一种寻找更好实现方式的研究。当这不可能的时候,我当然不得不坚持下去PYour的第一个定义不是有效的PHP代码(因为匿名函数不能有名称)。您的问题归结为什么是可调用的——如果字符串指向有效的函数名,那么字符串是可调用的。使用
is_callable()
使其“安全”,这根本不能确保
$callback
实际上是可调用的,这就是OP所寻找的。PHP从不保证某些东西是否可调用。如果它断了,它就断了。一根绳子?我试过了,但收到了另一个结果:可捕获致命错误:传递给myFunctionTest()的参数1必须是可调用的,在第2行的path/to/my/file.php中未给出任何参数Say what?“没有给出”显然意味着你没有通过辩论
callable
作为类型提示接受字符串(注意,
callable
作为实际类型提示仅从5.4开始提供):是的,我将使用is_callable,谢谢大家,但这似乎是唯一和最好的解决方案。