2012-06-03 31 views
23

例如,如果我這樣做:PHP關閉中的use關鍵字是否通過引用傳遞?

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

$my_var = 0; 
bar($my_var); 

$my_var進行修改?如果沒有,我怎樣才能在沒有添加參數到$foo的情況下工作?

+0

不,它不會被修改..這是在手冊中涵蓋 –

回答

39

不,他們沒有通過引用傳遞 - use遵循類似的符號,如函數的參數。你可以驗證你自己與debug_zval_dump功能的幫助下(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; 

輸出:

long(0) refcount(3) 
0 

一個全通全範圍工作的參考會有的引用次數1.寫你做到這一點通過定義用作傳遞按引用:

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

它也可以創建遞歸這樣:

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

我注意到我忘了標記這是最好的答案.. – elite5472

+0

謝謝你的提醒! – hakre

+1

比從未更好的一年! – elite5472

13

根據定義,閉包幾乎是按值封閉的,而不是通過引用。您可能會「參考使用」通過在參數列表中添加&

function() use (&$var) 

這可以例如3在anonymous functions manual page可以看出。

1

不,他們不通過引用傳遞。

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 
相關問題