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

为什么以及如何在PHP中使用匿名函数?,php,anonymous-function,Php,Anonymous Function,匿名函数可从PHP 5.3获得。 我应该使用它们还是避免它们?如果是,怎么做 编辑;刚刚发现了一些php匿名函数的好技巧 $container = new DependencyInjectionContainer(); $container->mail = function($container) {}; $conteiner->db = function($container) {}; $container->memcache = fu

匿名函数可从PHP 5.3获得。
我应该使用它们还是避免它们?如果是,怎么做

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

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

匿名函数的典型用法是回调函数。例如,您可以将它们用于从排序算法(如在函数
uksort
())中进行回调,或替换算法(如
preg\u replace\u callback
())。
我自己还没有在PHP中尝试过,所以这只是一个猜测。

也许你可以阅读PHP的文章。它实际上相当不错。

在使用需要like或do的函数时非常有用:

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

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);
PHP5.3中提供了匿名函数

匿名函数在PHP中已经存在很长时间了:从PHP4.0.1开始就存在了。但是,您完全正确,在PHP5.3中有一个新的概念和语法可用

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

如果您以前使用过
create_函数
,那么新语法可以直接插入您使用的地方。正如其他答案所提到的,常见的情况是“一次性”函数只使用一次(或至少在一个地方使用)。这通常是以回调的形式出现在//、等

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

其中给出了(为简洁起见剪短):


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

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

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

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

下面是在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));
$suppliers=['add1'=>'nodia'、'add2'=>'drish'、'add3'=>'UP'];
$getAddress=函数($suppliers){$address=[];

对于($i=1;$iHmmm,对于php文档来说,这确实是一篇好文章。是的,确实解释得很好。Edman,我根本不了解DependencyInjection的用法。@Tchalvak,为什么?对我来说,它真的很容易实现和使用。有什么陷阱吗?@Kirzilla
$container=new DependencyInjectionContainer()
它与匿名函数无关,这似乎是我找到的关于匿名函数用途的最准确答案。它强调了一个事实,即对于大多数一次性/一次性解决方案,匿名函数允许您将代码保留在正确的使用位置,而无需在一个位置定义它并在另一个位置调用。这就是bec如果你在一个项目中有成百上千个这样的一次性函数,那么omes是非常有用的。@salathe So..除了使用回调函数外,匿名函数是没有用的?我只是不明白关于thello@brasofilo的炒作是什么,你能再解释一下吗?我无法理解其中的区别。@San differe当您注册$di->add('service',new Object());对象的实例存储在di容器中时,nce就是一个例子。当您创建$di->add('service',function(){return new Object();})时,对象的实例是根据“请求”创建的所以,不同之处在于,您可以在di中注册所有服务,并且注册的服务不会占用内存,因为实例尚未创建。在许多情况下,开发人员向di注册服务,但每次请求都会创建服务,这一过程会减慢执行。当您使用匿名函数时,不会创建任何内容。
Array
(
    [a] => 5
    [n] => 3
    [e] => 2
    ... more ...
    [y] => 1
)
//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);
});
$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));