Как работает такая конструкция public function Name (Closure $closure){}

447
24 декабря 2016, 18:39

Вызывают в начале кода use Closure; это есть внутренний класс php Closure а далее используют внутри функции переменную $closure; из мануала совершенно не понятно как работать и применять такую переменную.

UPD

Вот так это использует во фреймворке laravel, только я не понимаю что этим пытаются добиться?

public function extend($abstract, Closure $closure)
{
    $abstract = $this->normalize($abstract);
    if (isset($this->instances[$abstract])) {
        $this->instances[$abstract] = $closure($this->instances[$abstract], $this);
        $this->rebound($abstract);
    } else {
        $this->extenders[$abstract][] = $closure; 
    }
}
Answer 1

Closure - это детали реализации замыкания, т.е. анонимных функций.

public function Name (Closure $closure){}

Запись утверждает, что методу должен быть передан один аргумент и этот аргумент должен являться замыканием. Т.е. в простом случае вот так:

$object->Name(function() {
    // какие-то действия
});

Функцию в метод обычно передают с одной целью - чтобы этот метод был где-то вызван. А вызвать функцию можно разными методами, например:

$closure(); // вот так
call_user_func($closure); // или так

Или передать в какую-то другую функцию, которая принимает параметром callback. Можно передавать дополнительные аргументы в функцию.

Замечу, что требовать именно Closure довольно странно и оправдано только в том случае, если вы собираетесь использовать методы именно класса Closure. В общем случае для указания необходимости передать в метод функцию необходимо указывать callable, что позволяет использовать любой из вариантов передачи этого псевдотипа.

Answer 2

Объект класса Closure не предназначен для инстанциирования с помощью оператора new, так как имеет приватный конструктор. Это "служебный" класс PHP, который используется для создания анонимных функций.

Конструкция

public function Name (Closure $closure){}

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

$variable = Name(function(параметры){что-то делаем;});
Answer 3

Вот так это использует во фреймворке laravel, только я не понимаю что этим пытаются добиться.

public function extend($abstract, Closure $closure)
{
    $abstract = $this->normalize($abstract);
    if (isset($this->instances[$abstract])) {
        $this->instances[$abstract] = $closure($this->instances[$abstract], $this);
        $this->rebound($abstract);
    } else {
        $this->extenders[$abstract][] = $closure; 
    }
}
READ ALSO
Навигация по сайту с помощью клавиатуры

Навигация по сайту с помощью клавиатуры

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

493
example api vine javascript

example api vine javascript

Я тут сутки не спал, поэтому помогите мне подумать

443
Отправка массива посредством AJAX запроса

Отправка массива посредством AJAX запроса

Отправляю запрос на сервер следующим образом

401