Что дает анонимная функция?
У меня есть учебник:
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
включает в себя некоторую логику установки и разрыва, возможно, начиная и транзакцию базы данных. В таком случае вам нужен конечный порядок выполнения вашего метода:
- Код установки платформы оценивается с помощью
$this->session->executeAtomically()
. - Ваш код (
$this->service->execute($request);
) оценивается $this->session->executeAtomically()
. - Код разрыва кода оценивается
$this->session->executeAtomically()
.
Оценивая выражение самостоятельно, а не обертывая его в закрытии, вместо этого код выполняется в следующем порядке:
- Ваш код оценивается вашим методом.
- Код установки платформы оценивается с помощью
$this->session->executeAtomically()
. - Код разрыва кода оценивается
$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
.