2012-06-03 24 views
23

Ví dụ, nếu tôi làm điều này:Từ khóa sử dụng trong đóng cửa PHP có được tham chiếu không?

function bar(&$var) 
{ 
    $foo = function() use ($var) 
    { 
     $var++; 
    }; 
    $foo(); 
} 

$my_var = 0; 
bar($my_var); 

sẽ $my_var được sửa đổi? Nếu không, làm thế nào để tôi làm việc này mà không cần thêm tham số vào $foo?

+0

không, nó sẽ không được sửa đổi .. điều này được đề cập trong hướng dẫn sử dụng –

Trả lời

39

Không, chúng không được chuyển theo tham chiếu - use tuân theo ký hiệu tương tự như thông số của hàm. Bạn có thể xác nhận điều đó một mình với sự giúp đỡ của debug_zval_dump function (Demo):

<?php 
header('Content-Type: text/plain;'); 

function bar(&$var) 
{ 
    $foo = function() use ($var) 
    { 
     debug_zval_dump($var); 
     $var++; 
    }; 
    $foo(); 
}; 

$my_var = 0; 
bar($my_var); 
echo $my_var; 

Output:

long(0) refcount(3) 
0 

Một toàn qua-all-phạm vi làm việc tham khảo sẽ có một refcount của 1. khi viết cho bạn đạt được điều đó bằng cách xác định dùng làm pass-by-reference:

$foo = function() use (&$var) 

Nó cũng có thể tạo ra đệ quy theo cách này:

$func = NULL; 
$func = function() use (&$func) { 
    $func(); 
} 
+1

Tôi nhận thấy rằng tôi đã quên đánh dấu câu trả lời này là câu trả lời hay nhất .. – elite5472

+0

cảm ơn người đứng đầu! – hakre

+1

Tốt hơn một năm sau không bao giờ! – elite5472

13

Đóng cửa, gần như theo định nghĩa, đóng theo giá trị, không phải bằng tham chiếu. Bạn có thể "sử dụng bằng cách tham khảo" bằng cách thêm một & trong danh sách đối số:

function() use (&$var) 

Điều này có thể được nhìn thấy trong ví dụ 3 trong anonymous functions manual page.

1

Không, chúng không được chuyển qua tham chiếu.

function foo(&$var) 
{ 
    $foo = function() use ($var) 
    { 
     $var++; 
    }; 
    $foo(); 
} 

$my_var = 0; 
foo($my_var); 
echo $my_var; // displays 0 

function bar(&$var) 
{ 
    $foo = function() use (&$var) 
    { 
     $var++; 
    }; 
    $foo(); 
} 

$my_var = 0; 
bar($my_var); 
echo $my_var; // displays 1 
Các vấn đề liên quan