函数参数与在匿名函数中使用关键字参数?

Functions arguments vs use keyword argument in anonymous function?

提问人: 提问时间:5/1/2022 最后编辑:Dharman 更新时间:5/2/2022 访问量:185

问:

我们经常会遇到一个问题,我们在PHP中使用了一些闭包,当我在我的项目中使用Laravel时,闭包在框架中被大量使用 就像在雄辩的查询中一样

所以这里有一个场景

$name = "john doe";

$greet = function() use ($name) {
    echo "hi " . $name;
    echo "\n";
};

$greetAgain = function($name) {
    echo "hi " . $name;
};

$greet();

$greetAgain($name);

现在我得到的输出是

hi john doe
hi john doe

看,根本没有区别,但根据闭包,我使用了两种方法,一种是

在函数的参数中传递的名称

在 use 关键字中传递的名称

但是由于没有区别,我只是想知道这两种不同方法获得相同结果的主要原因是什么

是的,我也知道使用关键字是因为匿名函数不能有外部范围

另外,我只是想知道何时使用哪种方法

我也问过这个问题,它出现了这个问题,在php中使用标识符以及它如何影响逻辑

PHP 参数 闭包

评论

0赞 waterloomatt 5/1/2022
关于使用哪一个没有硬性规定。如果您控制了代码,请使用在您正在使用的上下文中有意义的代码。但是,在您的简单示例中,我认为该函数应该接受一个参数,因为该函数本身只对问候某人有意义。传入字符串是一项硬性要求。
0赞 nice_dev 5/1/2022
闭包用于流程执行流的上下文中,例如将闭包从方法传递给其他方法,并将变量注入其作用域之外。您拥有的第二个声明是纯函数,它提供无状态定义的行为。调用时会立即调用它,而闭包可能会在以后执行。
0赞 apokryfos 5/2/2022
也许你有一个库,它有一个方法,要求你传递一个不接受参数的函数。这样,您可以将参数“传递”给函数,而无需期望库知道

答:

2赞 IMSoP 5/1/2022 #1

这两者似乎做同样的事情的原因是你过度简化了你的示例,并在你创建它后立即使用了该函数。在实际代码中,创建匿名函数的重点是在一个地方声明它,并在另一个地方使用它 - 例如,将其作为回调传递给 或 ;或多次重复使用。usortarray_map

很自然地,在两个不同的时间里,你可能有函数需要的数据,这就是声明的两个部分的用途:

  • 定义函数时,可以使用子句“捕获”数据use
  • 执行函数时,可以使用参数传入数据

演示差异的更好示例可能是:

// We know the surname we want to use every time the function runs
// Maybe it actually comes from user input
// But we don't yet know what first name to use
$surname = "Smith";
$greet = function($firstname) use ($surname) {
    echo "hi " . $firstname . " " . $name;
    echo "\n";
};

// This might happen in a completely different part of the code
// We might no longer know the surname, but the closure remembers it for us
foreach ( ['John', 'Jane', 'Jimmy'] as $firstname ) {
    $greet($firstname);
}