我能立即评估一个匿名函数吗?

5

可能是重复问题:
立即执行匿名函数

我想立即评估一个匿名函数,而不是它出现在方法参数中作为闭包对象。这可能吗?

例如:

$obj = MyClass;
$obj->Foo(function(){return "bar";}); // passes a Closure into Foo()
$obj->Foo(function(){return "bar";}()); // passes the string "bar" into Foo()?

第三行是非法语法,有没有什么方法可以解决这个问题?
谢谢

很难想象为什么你需要这样做?为什么不只是将函数的结果分配给一个变量,然后传递该变量呢? - Dmitri Snytkine
在这些例子中,你的函数基本上只是一个匿名函数,没有闭包的特征,它不会从当前上下文中“记住”任何变量。 - Dmitri Snytkine
1
我意识到,我真的不想解释为什么我需要这样做 - 显然这是一个不寻常的情况。 - Tom
@DmitriSnytkine,在JavaScript中,这种事情 一直都在做 - zzzzBov
1个回答

2
你可以使用 call_user_func 来实现这个功能...但是当你可以将其分配给一个变量并随后调用该变量时,这可能有点儿愚蠢。 call_user_func(function(){ echo "bar"; }); 你可能认为 PHP 5.4 的取消引用功能可以实现这一点。然而,你错了(至少在 RC6 版本中是如此)。

你为什么认为这很傻? - Tadeck
@Tadeck 嗯,对我来说,在你可以轻松地执行 $f = function() { echo '1'; }; $f(); 的情况下,调用 call_user_func 来执行额外的函数调用似乎没有意义。虽然在这种情况下使用 call_user_func 没有什么技术上的问题,但我觉得显式调用更易读。不过,我可以看出使用 call_user_func 的一行简洁性的吸引力。 - user895378

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接