匿名函数给了我什么?

时间:2018-03-01 19:50:59

标签: php

我有教程:

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

3 个答案:

答案 0 :(得分:9)

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

  1. 框架设置代码由$this->session->executeAtomically()评估。
  2. 您的代码($this->service->execute($request);)由$this->session->executeAtomically()评估。
  3. 框架拆解代码由$this->session->executeAtomically()评估。
  4. 通过自己评估表达式而不是将其包装在闭包中,代码将按以下顺序运行:

    1. 您的代码将按您的方法进行评估。
    2. 框架设置代码由$this->session->executeAtomically()评估。
    3. 框架拆解代码由$this->session->executeAtomically()评估。
    4. 大多数真实世界的闭包用例涉及某种延迟执行,要么执行设置/拆卸逻辑,执行“延迟加载”,如循环中多次执行代码等等。

答案 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)。