$closure = function ($param1) use ($param2) {
// 匿名函數本體
};
use 子句讓匿名函數能存取定義時作用域的變數(閉包特性)。
function test() {
$param2 = 'every';
return function ($param1) use ($param2) {
$param2 .= 'one';
print $param1 . ' ' . $param2;
};
}
$func = test();
$func('hello'); // 輸出:hello everyone
function test() {
$param2 = 'everyone';
$func = function ($param1) use ($param2) {
print $param1 . ' ' . $param2;
};
$param2 = 'everybody'; // 修改發生在閉包定義之後
return $func;
}
$func = test();
$func('hello'); // 輸出:hello everyone(捕獲定義時的 'everyone')
function test() {
$param2 = 'everyone';
$func = function ($param1) use (&$param2) { // 注意 & 符號
print $param1 . ' ' . $param2;
};
$param2 = 'everybody';
return $func;
}
$func = test();
$func('hello'); // 輸出:hello everybody(引用捕獲,取呼叫時的值)
| 捕獲方式 | 語法 | 捕獲時機 | 後續修改影響 |
|---|---|---|---|
| 值捕獲 | use ($var) | 閉包定義時 | 不影響 |
| 引用捕獲 | use (&$var) | 閉包呼叫時 | 影響結果 |
array_map、array_filter 等)搭配外部參數use 只能捕獲父作用域變數,不可捕獲全域變數(需 global 或 $GLOBALS)use ($var1, $var2) 多變數捕獲