从匿名PHP函数中的父作用域访问变量

Jak*_*ake 31 php closures

我想编写一个函数来执行一些记录事务的脏工作,但是匿名函数范围似乎没有注册父范围$db$value变量.如何将变量传递给闭包?

具有讽刺意味的是,SO标签'闭包'并没有非常准确地描述它的PHP版本......?

class controller
{
    function submit()
    {
        $db = new database();
        $result = $db->execute_tx(function() {
            $db->insert_model_a($value_a); // ERROR: $db is non-object
            $db->insert_model_b($value_b);
        });
    }
}

class database
{
   function execute_tx($atomic_action)
   {
        try
        { 
            $this->start();
            $atomic_action();
            $this->commit();
            // etc..
        }
        catch(...)
        { 
            $this->rollback();
            // etc..
        } 
        finally
        {
            // etc..
        }
   }

   function insert_model_a() { ... }
   function insert_model_b() { ... }
}
Run Code Online (Sandbox Code Playgroud)

sal*_*the 59

使用use关键字将变量绑定到函数的作用域中.

function() use ($db) {
Run Code Online (Sandbox Code Playgroud)

闭包还可以从父作用域继承变量.必须在函数头[using use]中声明任何此类变量.

http://www.php.net/manual/en/functions.anonymous.php

  • @Jake如果你在该函数中有10-15个值的状态,那你就做错了. (3认同)
  • @Jack 为什么会这样?为什么这么确定? (2认同)