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

Анонимная функция — это функция, которая определяется и впоследствии вызывается без привязки к какому либо идентификатору (имени).

Начнем с простого примера. Так называемых, переменных-функций. Это значит, что если добавить к переменной скобки, PHP будет искать функцию с именем, которое является значением этой переменной, затем попытается выполнить эту функцию.
Пусть у нас есть такая функция:

function Test($var) {
    echo "This is $var";
}

Вызовем эту функцию через переменную:

$f = "Test";
$f("variable function"); // This is variable function

Также такой способ вызова функций применим и в ООП:

class Foo
{
    function Variable()
    {
        $name = 'Bar';
        $this->$name(); // произойдет вызов метода Bar()
    }
 
    function Bar()
    {
        echo "This is Bar";
    }
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname();  // произойдет вызов $foo->Variable()

Теперь об анонимных функциях. Допустим, у нас есть такой код:

$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, function ($v) { return $v > 2; });

function ($v) { return $v > 2; } это лямбда функция. Можно сохранить ее в переменную, чтобы впоследствии можно было вызвать:

$max = function ($v) { return $v > 2; };
$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, $max);

А что если нам нужно изменить минимальное число для фильтрации? Мы можем написать другую лямбда функцию или создать замыкание (в PHP 5.3).

$max_comp = function ($max) {
  return function ($v) use ($max) { return $v > $max; };
};
$input = array(1, 2, 3, 4, 5);
$output = array_filter($input, $max_comp(2));

Замыкание — это функция, выполняемая только в своем окружении, к ней можно привязать одну или несколько переменных, которые доступны только когда функция вызвана. Замыкания пришли из функционального программирования. Замыкания похожи на лямбда функции, однако они могут взаимодействовать с переменными из внешней среды, в которой определено замыкание.
Простейший пример замыкания таков:

$string = "Hello World!";
$closure = function() use ($string) { echo $string; };
$closure(); // Hello World!

Переменные, передаваемые в замыкания определяются конструкцией use. По умолчанию они передаются по значению, это значит, что, если мы изменим значение переменной после определения замыкания, в замыкании оно останется прежним. Однако, имеется возможность передавать переменные по ссылке.
Рассмотрим пример:

$x = 1;
$closure = function() use (&$x) { ++$x; }
 
echo $x . "<br />"; // 1
$closure();
echo $x . "<br />"; // 2
$closure();
echo $x . "<br />"; // 3

Как видите, каждый раз при вызове замыкания, внешняя переменная $x увеличивается на 1.
Как видим из примера, самое очевидное применение замыканий в PHP — в качестве функций обратного вызова (callback-функций).

Запись опубликована в рубрике PHP & MySQL с метками , . Добавьте в закладки постоянную ссылку.

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">