今日もメモをのこそう

あとでみるメモ代わり

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の有用性がよくわかんなかったというお話でした。