Вопрос

Этот пример, взятый на странице функционального программирования 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

Даже если я назначу этот обратный вызов на функцию, вторичная функция кажется ненужной.

Я что -то упустил из виду или у него другая цель?

Это было полезно?

Решение

Это абсолютно необходимо для 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 () является ложным, потому что get_fx Возврат разные функции (закрытия) в зависимости от принятых аргументов.

Если бы вы пропустили первое return Вы бы ничего не получили от первой функции .. например. $ V5 и $ V6 ничего не назначат. Если вы пропустили второе return В возвращенной функции они ничего не вернут, когда их называют, т.е. $v5() не вернется 5 и $v6() не вернется 6.

Другие советы

Второй парам array_filter является callback. Анкет Вы можете указать это внутри array_filter в качестве anonymous function или укажите имя функции. Внутри anonymous function Вы делаете фильтрацию, вот почему return использовал. Второй возврат - использовать анонимную функцию в качестве обратного вызова при array_filter Он возвращает ссылку на эту функцию.

Вторая функция позволяет вам передавать не только обратный вызов ARRAY_FILTER, но и контекст обратного вызова и фильтрации ($ MIN) одновременно. Это убедительный способ повторного использования кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top