24
トランザクションを記録する汚い作業を行う機能を記述したいが、匿名関数スコープは親スコープ$db
と$value
変数を登録していないようだ。どのように変数をクロージャーに渡すことができますか?匿名PHP関数の親スコープからの変数へのアクセス
皮肉なことに、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() { ... }
}
これが唯一の方法ですか?私はいくつかの提出で10〜15の値を持っているので、私は多くの提出物を持っています... – Jake
はい。クロージャが閉じるようにする変数を明示的にインポートする必要があります。 – salathe
通常の関数引数でも変数を渡すことができることを忘れないでください。 – salathe