2010-10-29 36 views
9

Có cách nào để có thể ẩn hoàn toàn khai báo các biến cấp cao nhất là toàn cục để sử dụng trong bao đóng không?Đóng PHP và phạm vi biến toàn cầu tiềm ẩn

Ví dụ, nếu làm việc với mã như thế này:

$a = 0; //A TOP-LEVEL VARIABLE 

Alpha::create('myAlpha') 
    ->bind(DataSingleton::getInstance() 
     ->query('c') 
    ) 
    ->addBeta('myBeta', function($obj){ 
     $obj->bind(DataSingleton::getInstance() 
       ->query('d') 
      ) 
      ->addGamma('myGamma', function($obj){ 
       $obj->bind(DataSingleton::getInstance() 
         ->query('a') 
        ) 
        ->addDelta('myDelta', function($obj){ 
         $obj->bind(DataSingleton::getInstance() 
          ->query('b') 
         ); 
        }); 
      }) 
      ->addGamma('myGamma', function($obj){ 

       $a++; //OUT OF MY SCOPE 

       $obj->bind(DataSingleton::getInstance() 
         ->query('c') 
        ) 
        . 
        . 
        . 

Các măng xông được gọi từ một phương pháp như vậy:

public function __construct($name, $closure = null){ 
     $this->_name = $name; 
     is_callable($closure) ? $closure($this) : null; 
    } 

Vì vậy, trong bản tóm tắt/TL; DR, là có một cách để khai báo hoàn toàn các biến là toàn cục để sử dụng trong các bao đóng (hoặc các hàm khác mà tôi cho là) ​​mà không sử dụng từ khóa global hoặc $GLOBALS siêu toàn cầu?

tôi bắt đầu chủ đề này tại diễn đàn khác tôi thường xuyên (http://www.vbforums.com/showthread.php?p=3905718#post3905718)

Trả lời

31

Bạn phải khai báo trong định nghĩa đóng cửa:

->addBeta('myBeta', function($obj) use ($a) { // ... 

Nếu không, bạn phải sử dụng từ khóa global. Bạn phải thực hiện việc này cho mọi lần đóng sử dụng $a.

+7

Lưu ý rằng 'use' chỉ kế thừa các biến từ phạm vi gốc. Trong một kịch bản mà các bao đóng không được định nghĩa trong phạm vi toàn cục, bạn vẫn phải sử dụng từ khóa 'global' thay thế. Nó sẽ làm việc cho kịch bản của OP mặc dù. – Gordon

+0

Hmm, tôi sợ nó sẽ là 'sử dụng'. Hy vọng rằng vấn đề này sẽ không phổ biến trong hệ thống mà tôi đang phát triển, vì hầu hết các cuộc gọi * toàn cầu * có thể sẽ được thực hiện đối với các phiên bản tĩnh. Tôi đang cố gắng để fiddle với một trick liên quan đến 'extract()' trên '$ GLOBALS' và' call_user_func_array() '... – Dan

+5

Ngoài ra,' $ a ++ 'như được hiển thị trong ví dụ của OP sẽ không được áp dụng trở lại toàn cầu '$ a' trừ khi nó được sử dụng bởi tham chiếu, ví dụ' & $ a'. Các đối tượng được sử dụng bởi tham chiếu mặc dù. – Gordon

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