在Php中使用匿名函数和匿名函数有什么区别?

时间:2017-09-28 19:33:44

标签: php

我最近经历过这些匿名函数的例子,但我不是很清楚它们之间有什么区别,为什么在第二个函数中 使用use keyword以及为什么第一个返回null而第二个返回0:

<?php
$result = 0;

// first function
$one = function()
{ var_dump($result); };

// second function with use
$two = function() use ($result)
{ var_dump($result); };

$three = function() use (&$result)
{ var_dump($result); };


$result++;

$one();    // outputs NULL: $result is not in scope
$two();    // outputs int(0): $result was copied
$three();    // outputs int(1)
?>

参考链接:http://php.net/manual/en/functions.anonymous.php

3 个答案:

答案 0 :(得分:0)

    // first function
$one = function()
{ var_dump($result); 
};

必须重新发布一个Notice Undefined变量...如果在php.ini中禁用通知,则返回null

// second function with use
$two = function() use ($result)
{ var_dump($result); };

返回$ result = 0

你增加$ result ++;

$three = function() use (&$result)
{ var_dump($result); };

返回0 + 1 = 1;

答案 1 :(得分:0)

这会发出注意:未定义的变量并返回NULL,因为$result不在函数范围内,就像任何函数一样:

// first function
$one = function()
{ var_dump($result); };

这会将$result的值导入匿名函数。此时的值为0,因此$two访问的函数将始终使用0 $result

// second function with use
$two = function() use ($result)
{ var_dump($result); };

这个使用$result作为对实际$result变量的引用,所以当它在函数调用之前递增时它是1。这也允许您从函数中更改$result

$three = function() use (&$result)
{ var_dump($result); };

将变量引入函数的另一种方法是将其定义为接受参数并将它们传递给:

$one = function($var)
{ var_dump($var); };

$one($result);

或参考:

$one = function(&$var)
{ var_dump($var); };

$one($result);

答案 2 :(得分:0)

从您发布的链接

  

闭包还可以从父作用域继承变量。 必须将任何此类变量传递给使用语言构造。从PHP 7.1开始,这些变量不得包含superglobals,$ this或与参数同名的变量。

因此,如果您想使用函数外部的变量,请将它们传递给use构造。