Все ленты — последние статьи

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

В Wikipedia сказано, что анонимная функция это функция, которая может существовать без идентификатора. Звучит довольно-таки интересно! В этом уроке я покажу вам несколько примеров того, как можно создать и вызвать функцию нестандартными методами.

Начнём сразу с примеров:
1 function Test($var) {
2 echo "This is $var";
3 }

Это очень простая функция. Теперь помимо обычного вызова, мы можем запустить эту функцию при помощи переменной, которая хранит имя данной функции. Примерно вот так:
1 $f = "Test";
2 $f("variable function");

 

Если вы запустите код, то увидите сообщение This is variable function. К сведению сказать, обработка одинарных кавычек срабатывает быстрее, чем двойных.

Такую технику мы можем применять и в ООП. Пример с php.net:
01 class Foo
02 {
03 function Variable()
04 {
05 $name = 'Bar';
06 $this->$name(); // This calls the Bar() method
07 }
08
09 function Bar()
10 {
11 echo "This is Bar";
12 }
13 }
14
15 $foo = new Foo();
16 $funcname = "Variable";
17 $foo->$funcname(); // This calls $foo->Variable()

Это концепция довольно интересна. Она может быть использована для реализации обратных вызовов, таблиц функций и так далее.

Теперь я попробую объяснить вам, что такое анонимные функции:
1 $input = array(1, 2, 3, 4, 5);
2 $output = array_filter($input, function ($v) { return $v > 2; });

function ($v) { return $v > 2; } это анонимная функция. Так же мы можем присвоить её переменной, чтобы использовать в дальнейшем.
1 $max = function ($v) { return $v > 2; };
2
3 $input = array(1, 2, 3, 4, 5);
4 $output = array_filter($input, $max);

Теперь познакомимся с новым ключевым словом use. Напишем для этого другую анонимную функцию (работает с PHP 5.3):
1 $max_comp = function ($max) {
2 return function ($v) use ($max) { return $v > $max; };
3 };
4
5 $input = array(1, 2, 3, 4, 5);
6 $output = array_filter($input, $max_comp(2));

В этом примере мы используем эффект замыкания при помощи ключевого слова use. Эта техника позволяет анонимной функции получать доступ к внешним переменным. Повеяло ветерком процедурного программирования?

Вот ещё один пример попроще:
1 $string = "Hello World!";
2 $closure = function() use ($string) { echo $string; };
3
4 $closure();

Как я уже сказал, переменные, которые мы хотим использовать (из глобальной области видимости) в таких функциях необходимо передавать через use. Важно отметить, что по умолчание передаётся только значение, так что если вы хотите менять содержание передаваемой переменной и хотите, чтобы оно менялось за пределами анонимной функции, передавайте значение по адресу:
1 $x = 1;
2 $closure = function() use (&$x) { ++$x; };
3
4 echo $x . "<br />";
5 $closure();
6 echo $x . "<br />";
7 $closure();
8 echo $x . "<br />";

В этом примере, наш метод изменяет содержание переменной $x при каждом вызове анонимной функции. Если бы мы не передавали адрес переменной, а саму переменную у нас бы вывелось три 1.

Истинная красота «замыкания» в том, что оно не загромождает глобальное пространство имён. Как только анонимная функция выполнила действие, все переменные использующиеся в ней уничтожаются автоматически.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.codeforest.net/anonymous-or-lambda-functions-in-php
Перевел: Станислав Протасевич