Анонимные функции

Определение

Анонимные функции позволяют передавать в качестве параметров функции другие функции или присваивать их переменным.

Анонимная функция определяется как обычная функция за тем исключением, что она не имеет имени. Например:

$hello = function($name)
{
    echo "<h2>Hello $name</h2>";
};

$hello("Tom");

Здесь переменной $hello присваивается анонимная функция. Эта функция также определяется с помощью ключевого слова function. Она также принимает параметры – в данном случае параметр $name. И также она имеет некоторый блок операторов.

Для вызова подобной функции применяется имя представляющей ее переменной. Фактически подобная переменная применяется как стандартная функция.

Распространенным случаем применения анонимных функций является передача их параметрам других функции. Таким анонимные функции еще называют функциями обратного вызова или коллбеками (callback function). Рассмотрим простейший пример:

<?php
function welcome($message)
{
    $message();
}
 
welcome(function()
{
    echo "Hello!";
});
?>

В данном случае функция welcome() имеет параметр $message, который внутри функции вызывается подобно функции $message().

Для чего нужны анонимные функции?

В чем польза подобной передачи анонимных функций в качестве параметров? А польза заключается в том, что мы можем определить функцию, но на момент определения функции точно не знать, какие действия она будет выполнять при вызове. Либо просто сделать логику функции более гибкой. Например, нам надо определить функцию которая выводит сумму элементов массива:

function sum($numbers)
{
    $result = 0;
    foreach($numbers as $number){
         
        $result += $number;
    }
    return $result;
}
 
$myNumbers = [-2, -1, 0, 1, 2, 3, 4, 5];
$numbersSum = sum($myNumbers);
echo $numbersSum;           // 12

Но теперь пойдем дальше: допустим, мы хотим, чтобы функция подсчитывала сумму только тех чисел, которые удовлетворяют определенному условию, например, только положительных чисел или только четных чисел. Но на момент определения функции мы не знаем, какое условие мы захотим использовать в будущем. И в этом случае мы можем использовать анонимные функции:

<?php
function sum($numbers, $condition)
{
    $result = 0;
    foreach($numbers as $number){
        if($condition($number))
        {
            $result += $number; 
        }
    }
    return $result;
}
 
// для четных чисел
$isEvenNumber = function($n){ return $n % 2 === 0;};
// для положительных чисел
$isPositiveNumber = function($n){ return $n > 0;};
 
$myNumbers = [-2, -1, 0, 1, 2, 3, 4, 5];
$positiveSum = sum($myNumbers, $isPositiveNumber);
$evenSum = sum($myNumbers, $isEvenNumber);
echo "Сумма положительных чисел: $positiveSum <br /> Сумма четных чисел: $evenSum";
?>

Здесь функция sum() в качестве второго параметра – $condition принимает другую функцию. В цикле при переборе массива с помощью этой функции мы проверяем, удовлетворяет ли элемент массива условию:

if($condition($number))

Причем сейчас мы не значем, что это будет за условие, как именно функция $condition будет работать. Мы только знаем, что она получает число и возвращает true, если число удовлетворяет условию, либо false – если не удовлетворяет.

И если только число соответствует условию, тогда прибавляем число к общему результату:

$result += $number;

При вызове функции sum() в качестве параметра $condition передаются конкретные анонимные функции. Например, функиция, которая определяет, является ли число четным.

$isEvenNumber = function($n){ return $n % 2 === 0;};

Логика функции проста: если остаток от деления числа на 2 равен 0, то число четное. и функция возвращает true.

Далее мы передаем эту функицию:

$evenSum = sum($myNumbers, $isEvenNumber);

В итоге при вызове if($condition($number)) фактически будет выполняться функция $isEvenNumber().

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *