2013-09-04 28 views
14

Tôi hơi bối rối với việc đóng PHP. Ai đó có thể rõ ràng điều này cho tôi:Lẫn lộn với mã nhận dạng 'sử dụng' trong đóng cửa PHP

// Sample PHP closure 
my_method(function($apples) use ($oranges) { 
    // Do something here 
}); 

sự khác biệt giữa $apples$oranges và khi tôi nên sử dụng mỗi là gì?

+0

có thể trùng lặp của (http://stackoverflow.com/questions/1065188/in- php-5-3-0-what-is-the-function-use-identifier) ​​ – Trix

Trả lời

16

$apples sẽ đảm nhận giá trị được chuyển đến hàm khi hàm được gọi, ví dụ:

function my_method($callback) { 
    // inside the callback, $apples will have the value "foo" 
    $callback('foo'); 
} 

$oranges sẽ tham khảo các giá trị của biến $oranges mà tồn tại trong phạm vi mà bạn đã xác định đóng cửa. Ví dụ .:

$oranges = 'bar'; 

my_method(function($apples) use ($oranges) { 
    // $oranges will be "bar" 
    // $apples will be "foo" (assuming the previous example) 
}); 

Sự khác biệt là $oranges bị ràng buộc khi chức năng là định nghĩa$apples bị ràng buộc khi chức năng là gọi.


Đóng cửa cho phép bạn truy cập các biến được xác định bên ngoài hàm, nhưng bạn phải cho PHP biết các biến nào có thể truy cập rõ ràng. Điều này tương tự (nhưng không tương đương!) Để sử dụng từ khóa global nếu biến được định nghĩa trong phạm vi toàn cầu:

$oranges = 'bar'; 

my_method(function($apples) { 
    global $oranges; 
    // $oranges will be "bar" 
    // $apples will be "foo" (assuming the previous example) 
}); 

Sự khác biệt giữa việc sử dụng đóng cửa và global:

  • Bạn có thể ràng buộc địa phương biến để đóng cửa, global chỉ hoạt động với các biến toàn cục.
  • Đóng cửa ràng buộc giá trị của biến tại thời điểm đóng cửa là được xác định. Thay đổi đối với các biến sau khi hàm được xác định không ảnh hưởng đến nó.
    Mặt khác, nếu bạn sử dụng global, bạn sẽ nhận được giá trị biến có tại thời điểm hàm này là được gọi là.

    Ví dụ: [? Trong PHP 5.3.0, là những gì các chức năng "sử dụng" định danh]

    $foo = 'bar'; 
    $closure = function() use ($foo) { 
        echo $foo; 
    }; 
    $global = function() { 
        global $foo; 
        echo $foo; 
    }; 
    
    $foo = 42; 
    $closure(); // echos "bar" 
    $global(); // echos 42 
    
+0

Nó khác với việc sử dụng 'global' như thế nào bởi vì đó là điều đầu tiên xuất hiện trong đầu bạn. – enchance

+0

@enchance: Vì 'use' có thể truy cập các biến trong phạm vi cục bộ. Khi bạn sử dụng 'use ($ oranges)', '$ oranges' không cần phải toàn cục giống như khi bạn làm' global $ cam; '. –

+1

'global' ** không tương đương với' use' vì 'global' sẽ tham chiếu đến bối cảnh toàn cục thuần túy (cũng được biểu thị bằng' $ GLOBALS') trong khi 'use' sẽ chỉ chuyển ngữ cảnh cục bộ hiện tại. –

3

$apples được chuyển làm đối số cho my_method$oranges được đưa vào bên trong.