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)
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
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
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