PHP-有没有一种方法可以将已经定义的函数保存在变量中


PHP - is there a way to save an already defind function in a variable?

我对谷歌无法真正帮助我的东西感兴趣。。。

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

$function = function myFoo() { echo "bar"; }

并使用变量调用它:$function();

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

我有一个函数需要一个可调用的,当然call_user_func()可以在这里帮助我,但我需要在回调处理程序中传递方法名,我认为这很不安全,因为在我添加回调的那一刻,我无法判断它是否真的是一个函数,并且在我存储它时是否存在。

这就是为什么我想实现以下szenario:

此功能:

function anyFunction() {
    echo "doWhatever...!";
}

应该在以后的时间点保存在变量中:

$myOtherFunction = get_registered_func("anyFunction"); 

我知道get_registered_func()不存在,但我想知道这是否可能!

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

function setCallback(callable $theCallbackFunction) { }

并像这样使用:

setCallback($myOtherFunction);

这将具有一个很大的优势,即当参数不是函数或不存在时,会抛出异常/a致命错误。

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

PHP的callable元类型可以是:

  • 字符串
  • 数组
  • 匿名函数

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

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

我看不出为什么这不可能,除了没有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"));

这不是一个好方法,但可能会对您有所帮助:

function foo($a) {
    echo $a;
}
$callFoo = 'foo';
$callFoo('Hello World!'); // prints Hello