Lambda 関数は、変数に割り当てられるか、パラメーターとして別の関数に渡されます。クロージャーは、そのスコープ外の変数を利用します。
ラムダの使用
関数には名前がないため、通常の関数のように呼び出すことはできません。代わりに、変数に代入するか、別の関数に引数として渡す必要があります。
// Anonymous function
// assigned to variable
$greeting = function () {
return "Hello world";
}
// Call function
echo $greeting();
// Returns "Hello world"
無名関数をそのように使用するには、それを変数に割り当ててから、その変数を関数として呼び出します。
次のように、関数を別の関数に渡すこともできます。
// Pass Lambda to function
function shout ($message){
echo $message();
}
// Call function
shout(function(){
return "Hello world";
});
閉鎖とは何ですか?
Closure は、作成されたスコープ外の変数にアクセスできることを除けば、本質的に Lambda と同じです。
例えば:
// Create a user
$user = "Philip";
// Create a Closure
$greeting = function() use ($user) {
echo "Hello $user";
};
// Greet the user
$greeting(); // Returns "Hello Philip"
$user
上記のように、Closure 関数定義の use 句で変数が宣言されているため、Closure は変数にアクセスできます。
$user
クロージャー内で変数を変更しても、元の変数には影響しません。元の変数を更新するには、アンパサンドを追加します。変数の前のアンパサンドは、これが参照であることを意味するため、元の変数も更新されます。
For example:
// Set counter
$i = 0;
// Increase counter within the scope
// of the function
$closure = function () use ($i){ $i++; };
// Run the function
$closure();
// The global count hasn't changed
echo $i; // Returns 0
// Reset count
$i = 0;
// Increase counter within the scope
// of the function but pass it as a reference
$closure = function () use (&$i){ $i++; };
// Run the function
$closure();
// The global count has increased
echo $i; // Returns 1
このテキストは、>> culttt.comにある Philip Brown の記事の一部です。そこにはさらにいくつかの例があります。