匿名函数返回值

时间:2013-04-07 22:37:59

标签: php return anonymous-function

更新:从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

4 个答案:

答案 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();
  }),
);

eval()

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();