我有一个应该调用自己的匿名函数。但是,我手头没有变量或函数名,所以我希望找到一个函数,它可以在函数的上下文中返回“this”。有这样的事吗?
以下是一个例子:
$f = function() use($bar, $foo) {
// call this function again.
};
这样打电话:
call_user_func(__FUNCTION__);
导致这一点:
警告:call_user_func()期望参数1是有效的回调, 未找到函数“{closure}”或函数名称无效
如果我尝试将$ f放入use-list,那么它表示该变量未定义(因为它尚未定义)。
答案 0 :(得分:56)
__FUNCTION__
不能用于匿名函数
将包含匿名函数的变量作为'use'子句中的引用....
$f = function() use($bar, $foo, &$f) {
$f();
};
对此answer的提示。
答案 1 :(得分:7)
好的,我找到了这样做的方法:
$f = function() use(&$f) {
$f();
};
$f();
关键是要传递$ f作为参考。因此,PHP不会尝试传递值,而是传递对内存槽的引用。
答案 2 :(得分:1)
我有一个匿名函数,应该自称。
我更喜欢在调用递归函数时使用call_user_func_array(__FUNCTION__, $params);
。
由于你的例子没有任何论据,我猜call_user_func(__FUNCTION__);
会更适合。
您会期望并希望以下代码能够正常运行,但这太容易了。
$bar = 10;
$foo = 0;
$f = function() use (&$bar,$foo) {
if($bar){ // condition needed to prevent infinite loop
echo $bar-- . PHP_EOL;
call_user_func(__FUNCTION__); // wont work
}
};
$f();
__FUNCTION__
"Magic constant"对闭包不可用,因此需要调整代码以允许传递函数变量。我们可以通过将它作为常规参数或通过use
语句传递来使函数可用。
作为参数传递的函数
$bar = 10;
$foo = 0;
$f = function( $__FUNCTION__ = null ) use (&$bar, $foo) {
if($__FUNCTION__ && $bar){
echo $bar-- . PHP_EOL;
call_user_func( $__FUNCTION__, $__FUNCTION__);
}
};
$f ( $f );
通过use
声明传递的功能
$bar = 10;
$foo = 0;
$__FUNCTION__ = function() use (&$bar, $foo, &$__FUNCTION__) {
if($bar){
echo $bar-- . PHP_EOL;
call_user_func( $__FUNCTION__ );
}
};
$__FUNCTION__();
Working example,点击编辑 - > ideone it!重新运行代码。
答案 3 :(得分:-1)
http://www.php.net/manual/en/language.constants.predefined.php
编辑:在给出代码之前发布。当然它不适用于匿名函数。
call_user_func(__FUNCTION__, $param1, $param2);
call_user_func_array(__FUNCTION__, $params);
答案 4 :(得分:-4)
function i_dont_know() {
call_user_func(__FUNCTION__,$params);
//or
$funcname = __FUNCTION__;
$funcname($params);
}