2016-10-22 12 views
0

useキーワードをクロージャで使用している場合、クロージャに追加のパラメータを渡すとどのような効果がありますか?PHPはクロージャの追加パラメータを "使用"していますか?

例#1:

$myClosure = function($var1, $var2) use ($var3){ 
//Some code 
} 

例#2:それはおそらく異なり、すべてのもののように

$myClosure = function($var1, $var2, $var3){ 
//Some code 
} 

、しかし、私は2つの間の任意の機能的な違いが表示されません。誰かが、ある例が他のものより優先される状況や例を提案することはできますか?

+0

FWIWとクロージャ内の変数を使用するための素晴らしい方法だuseキーワード

$myvar = "hello"; $text = ""; $text = preg_replace_callback('/regex/', function($matches) use ($myvar) { return $myvar . " " . $matches[1] . "!"; }, $text); 

を使用したいです'use'を使わなければ、それはクロージャではありません。 –

答えて

1

この2つの機能に違いはありません。

引数は、関数のの呼び出し元によって提供されます。 が呼び出し元であり、必要な引数をすべて提供できる場合、基本的に違いはありません。

しかし、あなたはどこか別の機能を渡すかもしれないので、あなたはないの発信者であり、引数が渡されない制御を行います。これはクロージャが解決する状況です。関数を呼び出さずに値を使用できるようにすることができます。

In PHP 5.3.0, what is the function "use" identifier?も参照してください。


*:useでバインドされる変数は定義時に定義されます。変数の値が変化するのであれば、違いがあるでしょう:

$a = 1; 
$b = 2; 
$c = 3; 

$f1 = function($a, $b) use ($c) { 
    echo $a, $b, $c; 
}; 

$f2 = function($a, $b, $c) { 
    echo $a, $b, $c; 
}; 

$c = 42; 

$f1($a, $b); // 1, 2, 3 
$f2($a, $b, $c); // 1, 2, 42 
+1

さて、今は違いがあります。私は実際にあなたがこの質問をする前にあなたが提供したリンクを読んでいましたが、スコープに関するビットでは、関数のスコープが私が理解している関数の外側とは異なると解釈しました。私は、 'use'節に渡された値が呼び出し時ではなく、宣言時に変数の値を渡していたことを認識しませんでした。答えをもう一度読んで、「早期拘束」が意味するものだと思います。あなたの答えをありがとう、それは今より理にかなっています。 –

0

は、あなたが例えばpreg_replace_callbackのような事前定義されたパラメータ、とクロージャを使用している、とあなたが他の場所からの変数を使用したいと言いますあなたのコードでは、あなたはそれは、クロージャの外の変数にアクセスすることはできません。あらかじめ定義されたパラメータ、

関連する問題