这里第二次返回功能的目的是什么?

时间:2013-12-03 14:31:54

标签: php functional-programming

此示例取自phptherightway的函数式编程页面。

<?php
/**
 * Creates an anonymous filter function accepting items > $min
 *
 * Returns a single filter out of a family of "greater than n" filters
 */
function criteria_greater_than($min)
{
    return function($item) use ($min) {
        return $item > $min;
    };
}

$input = array(1, 2, 3, 4, 5, 6);

// Use array_filter on a input with a selected filter function
$output = array_filter($input, criteria_greater_than(3));

print_r($output); // items > 3

拥有return function()的目的是什么?

我刚刚写了这个并且它做了同样的事情。

array_filter($input, function($input) use ($min) {
    return $input > $min;
}); // items > 3

即使我将此回调指定给函数,也不需要辅助函数。

我是否忽视了某些内容,或者它有不同的目的?

3 个答案:

答案 0 :(得分:2)

criteria_greater_than绝对有必要返回您想要返回的值。例如。对于函数返回值5:

function get_5() {
    return 5;
}

您可以像$var = get_5();一样使用它,但如果您将其设置为常量,则只需执行$var = 5;call_my_function(5)。请注意,您需要使用return才能返回函数中的任何内容。现在考虑这个功能:

function get_fx($x)
{
    return function () use ($x)
           {
               return $x;
           };
}

$v5 = get_fx(5);
$v6 = get_fx(6);

什么是$v5$v6?嗯,它们是功能,因为这就是他们返回的内容。实际上$v5() == get_5()是正确的,但$ 6()== get_5()是false,因为get_fx返回不同的函数(闭包),这取决于传递的参数。

如果您要跳过第一个return,您将无法从第一个函数中获得任何内容。例如。 $ v5和$ v6不会分配任何内容。如果您在返回的函数中跳过第二个return,则在调用时它们不会返回任何内容,即。 $v5()不会返回5而$v6()不会返回6.

答案 1 :(得分:0)

array_filter的第二个参数是callback。您可以在array_filter中将其指定为anonymous function或指定函数的名称。在anonymous function内部进行过滤,这就是return使用的原因。第二个返回是使用匿名函数作为array_filter的回调,它返回此函数的引用。

答案 2 :(得分:0)

第二个函数允许您不仅将回调传递给array_filter,还允许一次传递回调和过滤上下文($ min)。这是重用代码的便捷方式。