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

PHP 5.3提供了匿名函数。

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

编辑; 刚刚发现了一些与php匿名函数有关的妙招...

$container           = new DependencyInjectionContainer();

$container->mail     = function($container) {};

$conteiner->db       = function($container) {};

$container->memcache = function($container) {};

伙计,我根本没有那个DependencyInjection用法。

@Tchalvak,为什么? 对于我来说,它真的很容易实现和使用。 有陷阱吗?

@Kirzilla $container = new DependencyInjectionContainer();与匿名函数无关

当使用需要像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);

这似乎是我所发现的有关匿名函数用途的大多数答案。它强调了这样一个事实,即对于大多数一次性/单位置解决方案,匿名函数使您可以在使用代码的地方保留正确的代码,而无需在一个位置定义它并在另一个位置调用。如果您在一个项目中有成百上千的一次性功能,这将变得非常有用。

Anonymous functions are available from PHP 5.3.

匿名函数在PHP中已经存在很长时间了:create_function自PHP 4.0.1起就存在。但是,您完全正确,PHP 5.3中提供了新的概念和语法。

Should I use them or avoid them? If so, how?

如果您曾经使用过create_function,那么新语法可以简单地滑入到您使用过的位置。正如其他答案所提到的,"抛弃式"功能通常只能使用一次(或者至少在一个地方使用)。通常以回调的形式出现,例如array_map / reduce / filter,preg_replace_callback,usort等。

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

$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

)

+1为usort,多数民众赞成在一个很好的用途。

@salathe So ..除了使用回调函数外,匿名函数没有用吗?我只是不知道炒作是什么

也许您可以阅读有关匿名函数的PHP文章。实际上非常好。

嗯,对于php文档,确实是一篇不错的文章。

是的,的确很好解释

匿名函数也可以在将函数创建到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容器中定义所有重要的插件,类,但是将在需要时创建实例。

您好,@ brasofilo,能否请您解释一下?我无法理解区别。

注册时,@ San差异例如:$ di-> add(service,new Object());对象的实例存储在di容器中。当您创建$ di-> add(service,function(){return new Object();});时对象的实例是根据"请求"创建的,因此区别在于您可以在di中注册所有服务,并且注册的服务不会消耗内存,因为尚未创建实例。在许多情况下,开发人员将服务注册到di,但在每次请求时都会创建服务,此过程会降低执行速度。当您具有匿名功能时,将不会创建任何内容。

非常感谢你!

匿名函数的典型用法是回调函数。例如,您可以将它们用于排序算法(例如函数uksort(http://lv.php.net/uksort)中的回调)或替换算法(例如preg_replace_callback(http://lv.php.net) /manual/en/function.preg-replace-callback.php)。

自己还没有在PHP中尝试过,所以这只是一个猜测。

这是在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));

在上面的示例中,我们编写了匿名函数,用于检查输入数组中是否存在键。如果存在,则将其放入输出数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值