更新:从PHP7开始,现在可以使用以下语法使用匿名函数解除引用:
$array[] = [
'new' => (function()
{
...
return mt_rand();
})(),
'or' => getClosure()()
]
原帖:我最近在试验一些东西,并想知道是否有办法使用匿名函数的返回值
假设我有一个for循环,它创建了一个数组,数组的每个值都必须有一个数据库调用,我想做的是:
for($i = 0; $i != 10; $i++)
{
$array[] = [
'new' => function(){
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
},
'old' => function(){
return mt_rand();
}
];
}
或者
echo function(){
// again, we'll just use mt_rand
return mt_rand();
};
这两个都返回closure
类。无论如何实际上将它们的返回值传递回数组或echo,对于上面的例子?
更新:我已经确定这是不可能的,因此可以在此处找到功能请求:http://bugs.php.net/bug.php?id=64608
答案 0 :(得分:21)
迄今为止最简单的解决方法:
echo call_user_func(function () { return 'foo'; });
答案 1 :(得分:2)
尝试将匿名function
分配给变量。
$myFunc = function() {
return 'Test';
}
echo $myFunc(); // Outputs Test
函数本身的值不是返回值。返回值是函数called
时函数返回的值。
修改强>
根据deceze的建议,您可以使用call_user_func()
。实现你想要的另一种方法是使用php的eval()
,这绝不是一个好的编码实践。
$array[] = array(
'new' => call_user_func(function() {
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
}),
'old' => call_user_func(function() {
return mt_rand();
}),
);
echo eval('$x = function() {
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
}; return $x();');
答案 2 :(得分:1)
在可以取消引用之前,似乎必须分配闭包 - 请尝试以下代码:
for($i = 0; $i != 10; $i++)
{
$array[] = [
'new' => call_user_func(function(){
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
}),
'old' => call_user_func(function(){
return mt_rand();
})
];
}
[edit] - 修改为使用call_user_func()而不是自定义函数 - doh!
答案 3 :(得分:0)
您必须将函数分配给var look here
这项工作
for($i = 0; $i != 10; $i++)
{
$array[] = [
'new' => function(){
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
},
'old' => function(){
return mt_rand();
}
];
}
echo $array[5]['new']();
或
$function = function(){
// again, we'll just use mt_rand
return mt_rand();
};
echo $function();