45

从 PHP 5.3 开始提供匿名函数。
我应该使用它们还是避免它们?如果是这样,怎么做?

已编辑;刚刚发现了一些使用 php 匿名函数的好技巧……

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

6 回答 6

91

匿名函数在使用需要回调函数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);
于 2010-03-09T20:36:00.450 回答
24

从 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
)
于 2010-03-09T21:20:35.300 回答
10

也许您可以阅读 PHP 关于匿名函数的文章。其实还不错。

于 2010-03-09T20:33:50.063 回答
4

匿名函数在将函数创建到 DI 容器中也非常有用,例如“bootstrap.php”:

//add sessions
$di->add("session",function(){ return new Session(); });
//add cache
$di->add("cache",function(){ return new Cache(); });
//add class which will be used in any request
$di->add("anyTimeCalledClass", new SomeClass());

使用参数和下一个变量的示例

$di->add("myName",function($params) use($application){
      $application->myMethod($params);
});

所以在这里你可以看到如何使用匿名函数来节省内存和服务器负载。您可以在di容器中定义所有重要的插件、类,但只会在您需要时创建实例。

于 2014-06-01T23:14:51.183 回答
2

匿名函数的典型用途是回调函数。例如,您可以将它们用于来自排序算法的回调,例如函数uksort( http://lv.php.net/uksort ) 或替换算法preg_replace_callback( http://lv.php.net/manual/en/function .preg-replace-callback.php)。我自己没有在 PHP 中尝试过,所以这只是一个猜测。

于 2010-03-09T20:30:18.923 回答
0

这是在 PHP 中使用匿名函数的示例

$suppliers=['add1'=>'nodia','add2'=>'delhi', 'add3'=>'UP'];
 $getAddress = function($suppliers){ $address=[];
 for($i=1;$i<5;$i++){
  if(array_key_exists('add'.$i, $suppliers))
    $address[]=$suppliers['add'.$i];
  }
 return $address;};
 print_r($getAddress($suppliers));

在上面的示例中,我们编写了匿名函数来检查输入数组中是否存在键。如果它存在,那么它将把它放入输出数组。

于 2018-01-24T07:14:04.873 回答