[英]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
]。
從 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.