アロー関数とクロージャのuse、結局どっちを使う
アロー関数(fn)はPHP 7.4の記法で、外側の変数を自動で値キャプチャする短いクロージャです。use句で取り込む変数を明示する従来のクロージャと使い分けます。
PHP 7.4のアロー関数(fn)は短く書けて便利ですが、従来のクロージャ(function + use)と何が違うのか曖昧なまま使っている人も多いはず。外側の変数の扱いが決定的に違います。
アロー関数は自動で外側をキャプチャ
$rate = 1.1;
$prices = array_map(fn($p) => $p * $rate, $items);
アロー関数は外側スコープの変数を自動で(値として)取り込みます。useを書く必要がありません。array_mapやarray_filterの短いコールバックには最適です。
クロージャは明示的にuse
$rate = 1.1;
$calc = function($p) use ($rate) {
return $p * $rate;
};
クロージャはuseで取り込む変数を明示します。冗長ですが、「何を外から持ち込んでいるか」がコード上ではっきりします。
使い分けの目安
1行で済む短い処理はアロー関数。複数行のロジックや、参照渡し(use (&$x))で外の変数を書き換えたい場合はクロージャ、という分け方が実務的です。アロー関数は値キャプチャのみで参照キャプチャができないので、外の変数を変更したいときはクロージャ一択になります。
まとめ
短いコールバックはfnで簡潔に、複雑なものや参照キャプチャが要るものはfunction+useで。アロー関数の「自動キャプチャ」は便利な反面、意図せず外の変数を巻き込むこともあるので、何を取り込んでいるか意識しておくといいです。
よくある質問
Q. アロー関数でuseは書けますか。
A. アロー関数は外側の変数を自動で値キャプチャするので、useは書きませんし書けません。
Q. 外側の変数を書き換えたいときはどうしますか。
A. アロー関数は値キャプチャのみで参照キャプチャができません。use (&$x)で参照渡ししたい場合は従来のクロージャを使います。