2013-02-23 20 views
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() { ... } 
} 

答えて

46

useキーワードを使用して、変数を関数の有効範囲にバインドします。

function() use ($db) { 

クロージャはまた、親スコープから変数を継承することができます。そのような変数は、関数ヘッダ[useを使用して]で宣言する必要があります。

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

+1

これが唯一の方法ですか?私はいくつかの提出で10〜15の値を持っているので、私は多くの提出物を持っています... – Jake

+0

はい。クロージャが閉じるようにする変数を明示的にインポートする必要があります。 – salathe

+0

通常の関数引数でも変数を渡すことができることを忘れないでください。 – salathe

関連する問題