我在教程中:

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)
    );
}


最佳答案

我不知道您在这里使用什么框架,但是我的假设是executeAtomically包含一些设置和拆卸逻辑,可能启动和提交数据库事务。在这种情况下,您希望方法的最终执行顺序为:


框架设置代码由$this->session->executeAtomically()评估。
您的代码($this->service->execute($request);)由$this->session->executeAtomically()评估。
框架拆卸代码由$this->session->executeAtomically()评估。


通过自己计算表达式而不是将表达式包装在闭包中,代码将按以下顺序运行:


您的代码由您的方法评估。
框架设置代码由$this->session->executeAtomically()评估。
框架拆卸代码由$this->session->executeAtomically()评估。


闭包的大多数现实世界用例都涉及某种延迟执行,例如执行设置/拆卸逻辑,执行“延迟加载”,多次执行代码(如循环执行)等。

08-19 13:18