2013-02-23 33 views
24

Tôi muốn viết một hàm thực hiện một số thao tác ghi nhật ký giao dịch, nhưng phạm vi hàm ẩn danh dường như không đăng ký phạm vi cha mẹ $db$value biến. Làm thế nào tôi có thể vượt qua các biến vào đóng cửa?Các biến truy cập từ phạm vi cha mẹ trong hàm PHP ẩn danh

Trớ trêu thay, thẻ SO 'đóng' không mô tả phiên bản PHP của nó rất chính xác ...?

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() { ... } 
} 

Trả lời

46

Sử dụng từ khóa use để ràng buộc biến vào phạm vi của hàm.

function() use ($db) { 

Đóng cửa cũng có thể kế thừa các biến từ phạm vi chính. Bất kỳ biến nào như vậy phải được khai báo trong tiêu đề hàm [sử dụng use].

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

+1

này là cách duy nhất? Bởi vì tôi có từ 10 đến 15 giá trị trong một số lần gửi và tôi có nhiều lần gửi qua ... – Jake

+0

Có. Bạn phải nhập rõ ràng các biến mà bạn muốn đóng để đóng. – salathe

+0

Đừng quên rằng bạn cũng có thể truyền vào các biến thông qua các đối số hàm bình thường. – salathe

Các vấn đề liên quan