我对谷歌无法真正帮助我的东西感兴趣。。。
我知道可以使用匿名函数,也可以像一样将函数存储在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