匿名函数返回值
Posted
技术标签:
【中文标题】匿名函数返回值【英文标题】:Anonymous Function return value 【发布时间】:2013-03-29 22:05:47 【问题描述】:更新:从 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
类。对于上面的示例,是否可以将它们的返回值实际传递回数组或回显?
更新:我已经确定这是不可能的,所以可以在这里找到功能请求:http://bugs.php.net/bug.php?id=64608
【问题讨论】:
你真的需要匿名函数吗?听起来你需要一个普通的,然后在循环中调用它 取决于您拥有的 php 版本...我相信 php 5.4 可能能够做到这一点,但运行旧软件包(即 Debian Squeeze 我知道运行 php 5.3)的服务器不会。跨度> @JulianH.Lam 我的示例在 PHP 5.4.13 上进行了测试 @JulianH.Lam 匿名函数自 PHP 5.3 起可用 我已经确定这是不可能的,所以可以在这里找到功能请求:bugs.php.net/bug.php?id=64608 【参考方案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();
)
];
[编辑] - 修改为使用 call_user_func() 而不是自定义函数 - doh!
【讨论】:
【参考方案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();
),
);
eval()
echo eval('$x = function()
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
; return $x();');
【讨论】:
我相信 OP 正在寻找访问$myFunc
时要返回的值,而不是 $myFunc()
。
@TimCooper 不,你需要函数调用,看这里codepad.viper-7.com/3nnjGW
@Sam:是的,我知道您必须评估函数才能获得返回值,但我相信这是您在哪里进行评估的问题。我认为 OP 希望在定义匿名函数时对其进行评估。
eval
是最糟糕的解决方案。【参考方案3】:
迄今为止最简单的解决方法:
echo call_user_func(function () return 'foo'; );
【讨论】:
匿名函数解引用现在在 PHP7 中可用!【参考方案4】:您必须将函数分配给一个变量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();
【讨论】:
在我的情况下,我需要直接返回,运行$a = function() return mt_rand(); ();
不起作用。
因为是赋值,所以可以$a(),有什么问题?以上是关于匿名函数返回值的主要内容,如果未能解决你的问题,请参考以下文章
python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reducemapfilter)
6.1 函数的返回值匿名函数lambdafilter函数map函数reduce函数