簡體   English   中英

在匿名 PHP 函數中訪問父作用域中的變量

[英]Access variables from parent scope in anonymous PHP function

我想編寫一個函數來記錄事務,但匿名函數作用域似乎沒有注冊父作用域$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關鍵字將變量綁定到函數的作用域中。

function() use ($db) {

閉包也可以從父作用域繼承變量。 任何此類變量都必須在函數頭中聲明[使用use ]。

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

從 PHP 8.0 開始,箭頭函數已經可用。 這些從父作用域繼承變量,沒有任何聲明:

箭頭函數支持與匿名函數相同的功能,除了使用父作用域中的變量始終是自動的。

它們旨在與單個表達式一起使用,因此對於問題中的代碼並不理想,但使用其中兩個可以:

class Controller
{
    function submit()
    {
        $db = new database();
        // one assumes $value_a and $value_b are defined in the submit method
        $result = $db->execute_tx(fn() => $db->insert_model_a($value_a));
        $result = $db->execute_tx(fn() => $db->insert_model_b($value_b));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM