クロージャーはレキシカルスコープの包含スコープの変数を束縛する関数です。
クロージャーは無名関数として作成する必要があります。
(後述するようにPHPでは無名関数と訳されるものと匿名関数とやくされるものは異なります。)
$x = 0;
$c = function() use(&$x) {
echo ++$x;
};
$c(); // 1
$c(); // 2
$c(); // 3
以下は構文エラーの例です。
$x = 0;
// 無名関数で定義していません。
function c() use(&$x) { // Parse error: syntax error, unexpected 'use' (T_USE),
echo ++$x;
}
$c();
$c();
$c();
<?php
function make_counter($count)
{
return function () use (&$count) { // $countはクロージャー内で変更されるため参照渡しにする必要があります。
return ++$count;
};
}
$counter = make_counter(0);
echo $counter(); // 1
echo $counter(); // 2
echo $counter(); // 3
例2
<?php
$total = array_map(
call_user_func(
function ($tax) {
return function ($x) use ($tax) {
return $x * $tax;
};
},
1.08
),
[100, 200, 300]
);
var_dump($total);
array (size=3)
0 => float 108
1 => float 216
2 => float 324
PHPではクロージャーを無名関数ともよびます。
またcreate_functionで作成した関数を匿名関数と呼びます。
名前 | 種類 | 内容 |
---|---|---|
無名関数 | クロージャーです。 | functionキーワードで作成します。 |
匿名関数 | 名前が一意についた関数です。 | ceate_function関数で作成します。 |
// 無名関数はクロージャーなのでuseで包含スコープの変数を束縛できます。
$a = 10;
$foo = function($x) use($a) {
echo $a + $x;
};
foo(5); // 15
var_dump($foo);
object(Closure)#1 (2) {
["static"]=>
array(1) {
["a"]=>
int(10)
}
["parameter"]=>
array(1) {
["$x"]=>
string(10) "<required>"
}
}
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。