Pregunta

Este ejemplo tomado de la página de programación funcional de 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

¿Cuál es el propósito de tener return function() ?

Acabo de escribir esto y hace lo mismo.

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

Incluso si designo esta devolución de llamada a una función, la función secundaria parece innecesaria.

¿Pasé por alto algo o tiene un propósito diferente?

¿Fue útil?

Solución

Es absolutamente necesario para criteria_greater_than Para devolver el valor que desea devolver. P.ej. para que una función devuelva el valor 5:

function get_5() {
    return 5;
}

Lo usas como $var = get_5();, pero si lo estuvieras en constante, simplemente lo harías $var = 5; o call_my_function(5). Observe que necesita usar return para devolver cualquier cosa en una función. Ahora considere esta función:

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

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

Qué son $v5 y $v6? .. Bueno, son funciones, porque eso es lo que devolvieron. En realidad $v5() == get_5() es verdadero, pero $ 6 () == get_5 () es falso, porque get_fx devolver diferentes funciones (cierres) que dependen de los argumentos aprobados.

Si te saltaras el primero return No obtendrías nada de la primera función ... por ejemplo. $ V5 y $ V6 no tendrían nada asignado. Si te saltaste el segundo return En la función devuelta no devolverían nada cuando se les llamara, es decir. $v5() no volvería 5 y $v6() no volvería 6.

Otros consejos

Segundo parámetro de array_filter es callback. Puedes especificarlo dentro array_filter como anonymous function o especificar el nombre de la función. Dentro de anonymous function haces el filtrado, por eso return usó. La segunda devolución es usar la función anónima como una devolución de llamada en array_filter Devuelve la referencia en esta función.

La segunda función le permite pasar no solo la devolución de llamada a Array_Filter, sino también contexto de devolución de llamada y filtración ($ min) a la vez. Es una forma convincente de reutilizar el código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top