为什么以及如何在 PHP 中使用匿名函数?

新手上路,请多包涵

匿名函数从 PHP 5.3 开始可用。

我应该使用它们还是避免使用它们?如果是这样,如何?

编辑:刚刚发现一些 PHP 匿名函数的好技巧:

 $container           = new DependencyInjectionContainer();
$container->mail     = function($container) {};
$container->db       = function($container) {};
$container->memcache = function($container) {};

原文由 Kirzilla 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 252
2 个回答

当使用需要 回调函数 的函数时, 匿名函数 很有用 array_filterarray_map 做:

 $arr = range(0, 10);
$arr_even = array_filter($arr, function($val) { return $val % 2 == 0; });
$arr_square = array_map(function($val) { return $val * $val; }, $arr);

否则你需要定义一个你可能只使用一次的函数:

 function isEven($val) { return $val % 2 == 0; }
$arr_even = array_filter($arr, 'isEven');
function square($val) { return $val * $val; }
$arr_square = array_map('square', $arr);

原文由 Gumbo 发布,翻译遵循 CC BY-SA 2.5 许可协议

匿名函数从 PHP 5.3 开始可用。

匿名函数在 PHP 中已经存在很长时间了: create_function 从 PHP 4.0.1 开始就存在了。然而,您是对的,从 PHP 5.3 开始有一个新的概念和语法可用。

我应该使用它们还是避免使用它们?如果是这样,如何?

如果您以前曾经使用过 create_function ,那么新语法可以直接插入您使用它的地方。正如其他答案所提到的,一个常见的情况是“一次性”功能,它们只能使用一次(或至少在一个地方)。通常以回调的形式出现,例如 array_map / reduce / filterpreg_replace_callbackusort 等。

使用匿名函数计算单词中字母出现次数的示例(这可以通过多种其他方式完成,这只是一个示例):

 $array = array('apple', 'banana', 'cherry', 'damson');

// For each item in the array, count the letters in the word
$array = array_map(function($value){
    $letters = str_split($value);
    $counts  = array_count_values($letters);
    return $counts;
}, $array);

// Sum the counts for each letter
$array = array_reduce($array, function($reduced, $value) {
    foreach ($value as $letter => $count) {
        if ( ! isset($reduced[$letter])) {
            $reduced[$letter] = 0;
        }
        $reduced[$letter] += $count;
    }
    return $reduced;
});

// Sort counts in descending order, no anonymous function here :-)
arsort($array);

print_r($array);

这给出了(为简洁起见被剪掉):

 Array
(
    [a] => 5
    [n] => 3
    [e] => 2
    ... more ...
    [y] => 1
)

原文由 salathe 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏