PHPの無名関数でuse()って意味があるの?
無名関数のuseについて「これって意味あるの?」と急に思ったのでメモ。
今回のオチ
意味はもちろんある。
無名関数はコールバックでよく使われていて、その時に引数を渡すときにuseを使う必要がある。
無名関数のおさらい
無名関数って関数名を使わないので少しスマートに記載できる。
※詳しくはネットに転がってるのでさっくり記載。
例としては以下のような感じ
$example = function () { var_dump('hello'); }; $example();
ひっかかったところ
何にひっかかったかというと「無名関数に引数を渡す」とき。
useを使うと無名関数に引数を渡せるのですが、普通の関数と同様にuse使わなくても引数は渡せる
(useを使わない場合) $message = 'hello'; $example = function ($message){ var_dump($message); }; $example($message); (useを使う場合) $message = 'hello'; $example = function () use ($message) { var_dump($message); }; $example();
上記は、両方ともhelloが出力される。 これって、ほとんど変わらなくない?と思ってしまったんですね。
一応の納得
無名関数をコールバックの時によく利用されてる。array_filterとか、preg_replace_callbackとか。
たとえば、array_filterだと以下のような感じ。
// $arrayから10以上のものだけをフィルタリングする。 $array = [6, 7, 8, 9, 10, 11, 12]; print_r(array_filter($array, function($var) { if ($var > 10) { return true; } })); // 結果 Array ( [5] => 11 [6] => 12 )
この時の無名関数の引数はarray_filterから渡される配列の中身となり外部(array_filterの外)からは渡せない。 この無名関数に、外部から引数を渡す方法が(多分)useということになる。 上記では、下限値10を関数内で指定しているが、array_filterの外で指定して渡してみる。
$array = [6, 7, 8, 9, 10, 11, 12]; $limit = 10; print_r(array_filter($array, function($var) use($limit) { if ($var > $limit) { return true; } })); Array ( [5] => 11 [6] => 12 ) 無事に渡せて同じ結果になった。
ということで「コールバックの時は引数を改めて指定することができない」から、すでにある変数を引数にする場合はuseを使わないといけない。
ネットでよく見たサンプルは、無名関数を一度変数に入れているサンプルだったので、useの有用性がよくわかんなかったというお話でした。