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


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

echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');

// Присваивание анонимной функции

$greet = function($name) {
    printf("Hello %srn", $name);
};

$greet('World');

// ---------------------------------------------------
// ЗАМЫКАНИЯ
// ---------------------------------------------------
$g = 'test';
$f = function($a, $b) use($g){
    echo $a . $b .  $g;
};
$g = 'test2';
$f();


// Замыкания идеально подходят для реализации событий

$this->events->on(User::EVENT_REGISTER, function($user){
    //обновить счетчик посещений
});

// Замыкания идеально подходят для создания валидаторов

$notEmpty = function($v) {
    return strlen($v) > 0 ? true : "Значение не может быть пустым”;
};

function getRangeValidator($min, $max){
    return function($v) use ($min, $max){
        return ($v >= $min && $v <= $max)
	    ? true
	    : "Значение не попадает в диапазон";
    };
}

// Замыкания позволяют делать отложенную загрузку:

// Где-то в модели файле или на старте
$service->register('Mailer', function() {
    return new Mailer('host', 'url');
});

// Где-то в контроллере
$this->service('Mailer')->mail(...);


// ---------------------------------------------------
// Замыкания могут быть рекурсивными (высший пилотаж):
// ---------------------------------------------------
$factorial = function( $n ) use ( &$factorial ) {
    if( $n == 1 ) return 1;
    return $factorial( $n - 1 ) * $n;
};