ラムダ関数とクロージャー。
これらは、大きな違いがない匿名関数です。 これらの関数は、通常の関数よりも柔軟性があり、変数に書き込んだり、必要な場所で定義したりできます。5.3より前のPHPでも匿名関数を使用できます。 create_function()関数を使用して作成できます。 しかし、それはかさばり、く、信頼性がありません。 PHP 5.3では、これをより自然で美しい方法で行うことができます。
ラムダ関数
- これらは匿名関数です。
- その場で発表されることがあります
- 変数に割り当てることができます
- パラメータとして関数に渡すことができます
<?php<br>$lamda = function() { print “Hello World!”; }<br><br>$lamda();<br><br>call_user_func($lamda);<br>call_user_func_array($lamda,array());<br>?><br><br><?php<br>$list = array(22,4,19,78);<br>usort(<br> $list,<br> function($a,$b){<br> if ($a==$b) return 0;<br> return ($a < $b)?-1:1;<br> }<br>);<br>print_r($list);<br><br>print_r(array_map(<br> function ($sn){ return ($n * $n * $n);},<br> array(1,2,3,4,5,6)<br>));<br>?><br> <br> * This source code was highlighted with Source Code Highlighter .
短絡
- これらは匿名関数です。
- その場で発表されることがあります
- 変数に割り当てることができます
- パラメータとして関数に渡すことができます
- 関数の外部で宣言された変数を使用できます
<?php
$ string = “Hello World!”;
$closure = function() use ($ string ) {print $ string ; };
$closure();
?>
<?php
function getClosure(){
$ string = “Hello World!”;
return function() use ($ string ) {print $ string ; };
}
$closure = getClosure();
$closure();
?>
* This source code was highlighted with Source Code Highlighter .
use()とグローバルの使用の違い
use()の代わりに、グローバルを使用した方が良いことを提案できます。 はい、もちろん、単純なケースでは特定の手法の使用は同じですが、他のケースもあります。関数があり、その中にローカル変数があると想像してください。 そして、この変数をクロージャーで使用したいと思います。 この場合、use()演算子を使用する必要があります。 グローバルを使用した場合、クロージャーは$ globals配列を検索し、変数を見つけられません。 use()を使用すると、ローカル変数をクロージャーの本体で使用できます。
その他のユースケース
- イベントハンドラー(JavaScriptなど)として使用できます。
- 出力関数内。 送信されたパラメーターが変更された場合。 出力クラスを開いて変更する代わりに、関数をパラメーターとして渡すだけで、クラスが必要とする形式でパラメーターを再作成できます。
- 等
そして最後に
ご覧のとおり、クロージャーとラムダ関数は、使用方法を知っていれば非常に便利です。 もちろん、PHP 5.3までにもう少し待たなければならないのは残念です。 しかし、私たちは、切望されている技術革新に対してPHP開発者に敬意を表さなければなりません。