我有教程:
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)
);
}
答案 0 :(得分:9)
我不知道你在这里使用什么框架,但我的假设是executeAtomically
中包含一些设置和拆除逻辑,可能是启动并提交数据库事务。在这种情况下,您希望方法的最终执行顺序为:
$this->session->executeAtomically()
评估。$this->service->execute($request);
)由$this->session->executeAtomically()
评估。$this->session->executeAtomically()
评估。通过自己评估表达式而不是将其包装在闭包中,代码将按以下顺序运行:
$this->session->executeAtomically()
评估。$this->session->executeAtomically()
评估。大多数真实世界的闭包用例涉及某种延迟执行,要么执行设置/拆卸逻辑,执行“延迟加载”,如循环中多次执行代码等等。
答案 1 :(得分:3)
在这种情况下,它违背了匿名函数的目的,但它们用于扩展函数范围。由于$request
变量的实例未通过函数传递,因此如果没有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 ) { ... }
答案 2 :(得分:1)
因为当调用top函数执行时,它会立即执行executeAtomically
;匿名函数似乎被用作回调函数,稍后将由$this->service->execute($request)
调用。
换句话说,它可以在executeAtomically
内稍后推迟请求(Excel.run
)。