15

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

4

4 回答 4

24

迄今为止最简单的解决方法:

echo call_user_func(function () { return 'foo'; });
于 2013-04-07T23:39:09.987 回答
2

尝试将匿名分配给function变量。

$myFunc = function() {
  return 'Test';
}

echo $myFunc(); // Outputs Test

函数本身的值不是返回值。返回值是函数为 时函数返回的值called

编辑:

正如deceze建议的那样,您可以使用call_user_func(). 实现您想要的另一种方法是使用 php's 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();');
于 2013-04-07T22:41:52.297 回答
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() 而不是自定义函数 - 哦!

于 2013-04-07T23:36:34.983 回答
0

您必须将函数分配给 var,看这里

这部作品

    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();
于 2013-04-07T22:44:46.590 回答