Анонимные функции, также известные как замыкания (closures), позволяют создавать функции, не имеющие определенных имен. Они наиболее полезны в качестве значений callback-параметров, но также могут иметь и множество других применений.
Использование анонимных фукций в php стало возможным, начиная с версии 5.3.0. В версии 5.4.0 в анонимных функциях стало возможным использовать $this. Вот пример анонимной функции:
Использование анонимных фукций в php стало возможным, начиная с версии 5.3.0. В версии 5.4.0 в анонимных функциях стало возможным использовать $this. Вот пример анонимной функции:
<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);
}, 'hello-world');
// выведет helloWorld
?>
Замыкания также могут быть использованы в качестве значений переменных; PHP автоматически преобразует такие выражения в экземпляры внутреннего класса Closure. Присвоение замыкания переменной использует тот же синтаксис, что и для любого другого присвоения, включая завершающую точку с запятой. Вот маленький пример присвоения анонимной функции переменной:
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>
Использование ключевого слова use.
Замыкания могут также наследовать переменные из родительской области видимости. Любая подобная переменная должна быть объявлена в заголовке функции. Наследование переменных из родительской области видимости не то же самое, что использование глобальных переменных. Глобальные переменные существуют в глобальной области видимости, которая не меняется, вне зависимости от того, какая функция выполняется в данный момент. Родительская область видимости — это функция, в которой было объявлено замыкание.
Функция обращается к своему контексту при помощи ключевого слова use. Это схоже с использованием ключевого слова global, но не идентично ему. Вот пример:
<?php
$arr = array(1, 2, 3, 4, 5);
$func = function($par) use ($n){
return $par + $n;
};
$n = 1;
$b = array_map($func, $arr);
print_r($b);
// Выведит: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
?>