トランザクションをログに記録するダーティな作業を行う関数を作成したいのですが、無名関数スコープが親スコープを登録していないようです$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() { ... }
}
use
キーワードを使用して、変数を関数のスコープにバインドします。
function() use ($db) {
クロージャは、親スコープから変数を継承する場合もあります。このような変数はすべて、関数ヘッダーで[
use
を使用して]宣言する必要があります。