2017-09-28 30 views
0

私は最近、これらの無名関数の例を調べましたが、その違いは何ですか、なぜ2番目の関数 use keywordが使用され、なぜ最初の1つが返され、2番目の戻り値が0:PHPで使用する匿名関数と匿名関数の違いは何ですか?

<?php 
$result = 0; 

// first function 
$one = function() 
{ var_dump($result); }; 

// second function with use 
$two = function() use ($result) 
{ var_dump($result); }; 

$three = function() use (&$result) 
{ var_dump($result); }; 


$result++; 

$one(); // outputs NULL: $result is not in scope 
$two(); // outputs int(0): $result was copied 
$three(); // outputs int(1) 
?> 

Refrenceリンク:php.iniの通知にある場合http://php.net/manual/en/functions.anonymous.php

+1

例を実行しようとしましたか? – rndus2r

+2

通知は無効になっていますか?その場合は、テストの目的でそれらをアクティブにします。 'use'を使うと、無名関数の範囲外の変数を参照することも、使用することもできます。つまり、無関係の機能には独自のスコープ(いくつかのスーパーグローバルを含む)があります。つまり、このスコープ外のものにはアクセスできません。したがって、宣言しなければ、変数はanon関数のスコープで使用されるため、NULLになります(通知をオンにした場合は、通知が得られます)。 '$ result'に直接アクセスすると、**を使用できますが、' $ result'は変更できません。 '&$ result'は参照を渡します。 – rndus2r

+0

はい!私は言及と同じ結果を試みた。 –

答えて

0

これはお知らせ発する:未定義の変数をして$resultだけで任意の関数のように、関数のスコープではないためNULLを返します

// first function 
$one = function() 
{ var_dump($result); }; 

これは、無名関数に$resultの値をインポートします。この時点での値は0ので$twoによってアクセスされる関数は常に$resultため0が使用されている。

// second function with use 
$two = function() use ($result) 
{ var_dump($result); }; 

をこの1つは、実際の$result変数への参照として$resultを使用し、それがインクリメントされたときに機能がそれを呼び出す前1です。また、これはあなたが関数内から$resultを変更することができます:あなたの関数に変数を取得行うに

$three = function() use (&$result) 
{ var_dump($result); }; 

もう一つの方法は、引数を受け入れ、それらを渡すために、それを定義することです:

$one = function($var) 
{ var_dump($var); }; 

$one($result); 

かと参照:

$one = function(&$var) 
{ var_dump($var); }; 

$one($result); 
0

まあ

// first function 
$one = function() 
{ var_dump($result); 
}; 

は...お知らせ未定義の変数をretrurn必要がありますあなたは$結果を++インクリメント無効リターンヌル

// second function with use 
$two = function() use ($result) 
{ var_dump($result); }; 

戻ります$ result = 0

$three = function() use (&$result) 
{ var_dump($result); }; 

return 0 + 1 = 1;

0

リンクから、あなたは

を掲載しました

クロージャは、親スコープから変数を継承することもできます。 このような変数はすべて、使用言語構文に渡す必要があります。 PHP 7.1から、これらの変数にスーパーグローバル、$ this、またはパラメータと同じ名前の変数を含めてはいけません。

したがって、関数の外から変数を使用する場合は、use構造体に渡します。