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

2022-08-30 11:06:36

匿名函数从 PHP 5.3 中可用。
我应该使用它们还是避免使用它们?如果是这样,如何?

已编辑;只是用php匿名函数找到了一些不错的技巧...

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

答案 1

当使用需要回调函数的函数(如array_filter或array_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);

答案 2

匿名函数从 PHP 5.3 中可用。

匿名函数在PHP中已经存在了很长时间:create_function自PHP 4.0.1以来一直存在。但是,您非常正确,从PHP 5.3开始,有一个新的概念和语法可用。

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

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

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

$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
)

推荐