2012-06-03 6 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 

をフル・スルー・オール・スコープ・ワーキング参照の参照カウントを持っているでしょう

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

それは再帰をこのように作成することもできます::

あなたは参照渡しとして使用することを定義することによって達成することを書かれたとおり1。
$func = NULL; 
$func = function() use (&$func) { 
    $func(); 
} 
+1

にヘッドアップのための – elite5472

+0

おかげで覆われています! – hakre

+1

1年後には決して良いことはありません! – elite5472

13

クローズはほとんどの場合、参照によってではなく値によって閉じられます。あなたは、引数リストの&を追加することで、「参照によって使用」があります。

function() use (&$var) 

これはanonymous functions manual page例3で見ることができます。

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 
関連する問題