Что дает анонимная функция?

У меня есть учебник:

public function execute(BaseRequest $request)
{
    $operation = function() use($request) {
        return $this->service->execute($request);
    };

    return $this->session->executeAtomically(
        $operation->bindTo($this)
    );
}

Что дает анонимная функция?

Почему я не могу просто сделать:

public function execute(BaseRequest $request)
{
    $operation = $this->service->execute($request);

    return $this->session->executeAtomically(
        $operation->bindTo($this)
    );
}

?

Ответы

Ответ 1

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

  1. Код установки платформы оценивается с помощью $this->session->executeAtomically().
  2. Ваш код ($this->service->execute($request);) оценивается $this->session->executeAtomically().
  3. Код разрыва кода оценивается $this->session->executeAtomically().

Оценивая выражение самостоятельно, а не обертывая его в закрытии, вместо этого код выполняется в следующем порядке:

  1. Ваш код оценивается вашим методом.
  2. Код установки платформы оценивается с помощью $this->session->executeAtomically().
  3. Код разрыва кода оценивается $this->session->executeAtomically().

Большинство случаев использования в режиме реального времени включают в себя какое-то замедленное выполнение, либо для выполнения логики установки/разрыва, выполнения "ленивой загрузки", выполнения кода несколько раз, как в цикле и т.д.

Ответ 2

В этом контексте он побеждает цель анонимных функций, однако они используются для расширения сферы действия. Поскольку экземпляр переменной $request не передается через функцию, он будет недоступен без use(). Только анонимные функции позволяют use() предложение use(), поэтому в другом контексте было бы полезно, если бы у вас были глобальные переменные, которые вы не хотите постоянно передавать через функцию.

Пример:

$someDatabase = new PDO();

$doSomeQuery = function( $sql, $bind = [] ) use ( $someDatabase )
{
    $stmt = $someDatabase->Prepare( $sql );
    return $stmt->execute( $bind );
};

// Now we never have to pass the connection in which the developer may not need to know
foreach( $doSomeQuery( 'SELECT * FROM tbl WHERE col = ?', ['value'] )->fetchAll() as $row ) { ... }

Ответ 3

потому что, когда вы вызываете верхнюю функцию execute, она немедленно выполняет $this->service->execute($request); анонимная функция, по-видимому, используется как обратный вызов, который позже будет вызван executeAtomically.

Другими словами, это позволяет отложить запрос ($this->service->execute($request)) позже, внутри executeAtomically.