php - 在匿名 PHP 函数中从父范围访问变量

标签 php closures

我想写一个函数来记录事务,但匿名函数作用域似乎没有注册父作用域 $db$value变量。如何将变量传递到闭包中?

具有讽刺意味的是,SO 标签“closures”并没有非常准确地描述它的 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() { ... }
}

最佳答案

使用 use 关键字将变量绑定(bind)到函数的范围内。

function() use ($db) {

Closures may also inherit variables from the parent scope. Any such variables must be declared in the function header [using use].

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

关于php - 在匿名 PHP 函数中从父范围访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15042197/

相关文章:

php - 创建具有指定数量元素的数组

php - 在 SugarCRM 中创建一个简单的自定义 View

php - 获取 fputcsv 的返回值

unit-testing - 使用闭包对 GORM 调用进行单元测试

function - 为什么 Rust 中的闭包和函数之间存在巨大差异以及如何解决它?

php - 500内部服务器错误。 PHP提交页面

php - 双左连接查询需要优化

循环内的 JavaScript 闭包 – 简单的实际示例

ios - 使用 Xcode LLDB 控制台在 Swift 中调试闭包

javascript - 编码挑战,尝试递归解决。使用 Closure 进行缓存帮助