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

时间:2014-04-25 14:34:42

标签: php function variables callback store

我对Google无法真正帮助我的事感兴趣...

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

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

并使用变量$function();

调用它

到目前为止一直很好但是如果我在某个地方声明了一个函数或方法但​​是在初始化时没有保存呢?

我有一个期望可调用的函数,当然call_user_func()可以帮助我,但是我需要在我的回调处理程序中传递方法名称,我认为这是非常不安全的,因为在我添加的时候回调我不能说它是否真的是一个函数,并且在我存储时存在。

Thatswhy我想了解以下szenario:

此功能:

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

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

$myOtherFunction = get_registered_func("anyFunction"); 

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

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

function setCallback(callable $theCallbackFunction) { }

并像这样使用它:

setCallback($myOtherFunction);

当参数不起作用或不存在时,这会产生很大的优势,即抛出异常/致命错误。

简而言之,有没有办法在变量中存储先前定义的,已存在的函数或方法?

3 个答案:

答案 0 :(得分:2)

PHP's callable meta type可以是:

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

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

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

答案 1 :(得分:1)

我认为除了没有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"));

答案 2 :(得分:0)

不是一个好方法,但也许这有助于你:

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

$callFoo = 'foo';

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