【问题标题】:Understanding anonymous functions PHP了解匿名函数 PHP
【发布时间】:2016-05-27 16:14:42
【问题描述】:

我一直在学习使用 php 进行 Web 开发,但我对匿名函数有点困惑。特别是关于参数的传递以及它们如何在这样的函数中工作。 比如在代码中

$array = array("really long string here, boy", "this", "middling length", "larger");
usort($array, function($a, $b) {
return strlen($a) - strlen($b);
});
print_r($array);

我真的不明白参数$a$b 是如何使用的。我认为将它们用于比较是为了对数组进行排序,以便定义函数应如何使用它们并从中获取它们?
在类似下一个的代码中

$mult = function($x)
{
 return $x * 5;
};
echo $mult(2);

我知道参数是直接传递给函数的,用来返回乘法的结果。
在这个post的例子中

$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);

变量$val 取自哪里?

我知道这可能并不像看起来那么复杂,但我真的对在此类函数上使用参数感到困惑

【问题讨论】:

  • 一般来说,您想查找外部函数的文档,例如 php 中的 array_map 或 javascript 中的 array.reduce 以了解哪些参数被传递到您要提供的回调中。

标签: php web-deployment anonymous-function


【解决方案1】:
usort($array, function($a, $b) {
    return strlen($a) - strlen($b);
});

让我们举这个例子。当您将函数传递给usort() 时,PHP 在内部 使用数组中的 2 个元素调用它,以查看哪个更大/更小。

$a$b 值来自 内部 usort() 函数。它的代码使用 2 个参数调用提供的函数。您的参数不需要命名为$a$b,可以随意命名。

【讨论】:

  • 如果你想用一组特定的参数调用数组中的匿名函数,你可以使用$anonymous($var1, $var2)$result = call_user_func($anonymous, $var1, $var2)
  • 是的,将其分配给变量或直接调用它。所以基本上,这两个参数是通过函数在内部进行管理的,我只需要提供它们,callable 就会发挥它的魔力?
  • @Kronos:“参数”在函数中处理,是的。 usort() 的代码中的某处是这样的一行:$pos = $callback($arr[0], $arr[1]);。这就是调用函数时参数的来源。 (注意:我只是把那一行作为一个例子,它不是usort()的代码中的字面意思。)
  • @RocketHazmat 我知道,不用担心 jajaja 所以,要在 php 函数中管理可调用对象,我只需要遵循 php 的文档,对吗?
  • @Kronos:是的,这些函数的文档应该告诉你可调用对象应该有多少个参数以及它们将包含什么。
【解决方案2】:

您的问题实际上不是关于匿名函数,而是关于传递可调用对象。

让我们考虑第一个例子

usort($array, function($a, $b) {
return strlen($a) - strlen($b);
});

让我们稍微重构一下,用命名函数替换匿名函数。

function compareAB($a, $b) {
return strlen($a) - strlen($b);
}

usort($array, 'comapreAB');

如您所见,您仍然可以询问$a$b 是如何通过的。

嗯,答案很简单。 usort 期望您提供可调用的,它将接受 2 个参数并在内部调用它。

【讨论】:

  • 但这只发生在 php 内置函数中?那么用户定义的可调用函数是如何工作的呢?
猜你喜欢
  • 2015-01-27
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多