Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the purpose of second return function here?

This example taken from phptherightway's functional programming page.

<?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

What is the purpose of having return function() ?

I just wrote this and it does the same thing.

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

Even if I appoint this callback to a function, the secondary function seems unnecessary.

Did I overlook something or does it have a different purpose?

like image 550
Aristona Avatar asked Nov 01 '22 09:11

Aristona


1 Answers

It's absolutely necessary for criteria_greater_than to return the value you want to return. Eg. for a function to return the value 5:

function get_5() {
    return 5;
}

You use it like $var = get_5();, but if you were setting it to a constant you would just do $var = 5; or call_my_function(5). Notice you need to use return in order to return anything in a function. Now consider this function:

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

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

What are $v5 and $v6?.. Well they are functions, because thats what they returned. In fact $v5() == get_5() is true, but $6() == get_5() is false, because get_fx return different functions (closures) dependent on the arguments passed.

If you were to skip the first return you wouldn't get anything from the first function.. eg. $v5 and $v6 wouldn't have anything assigned. If you skipped the second return in the returned function they wouldn't return anything when called, ie. $v5() wouldn't return 5 and $v6() wouldn't return 6.

like image 69
Sylwester Avatar answered Nov 10 '22 18:11

Sylwester