無名関数とは?
公式ドキュメントの引用です。
無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 callable パラメータとして使う際に便利ですが、用途はそれにとどまりません。
callableパラメータ
callableパラメータとしての使い方を見てみます。
<?php
// 使用方法1
// クロージャ
$double = function($number) {
return $number * 2;
};
$numbers = [1, 2, 3, 4];
// 各値を2倍にしていく
$new_numbers = array_map($double, $numbers);
// 結果
[2, 4, 6, 8]
// 使用方法2
$numbers = [1, 2, 3, 4];
$new_numbers = array_map(function($number) {
return $number * 2;
}, $numbers);
// 結果
[2, 4, 6, 8]
変数の使用
次に、外部から変数を使用する場合の使い方を見てみます。
エラー例
<?php
$numbers = [1, 2, 3, 4];
// 倍率を指定する。
$magnification = 3;
$new_numbers = array_map(function($number) {
return $number * $magnification;
}, $numbers);
// 結果
PHP Notice: Undefined variable: magnification in......
そのまま、変数を使用しようとするとエラーとなります。
そこで、use
を使用します。
<?php
$numbers = [1, 2, 3, 4];
// 倍率を指定する
$magnification = 3;
$new_numbers = array_map(function($number) use ($magnification) {
return $number * $magnification;
}, $numbers);
// 結果
[3, 6, 9, 12]
もちろん参照渡しにすると、変数の値を変更できます。
<?php
$numbers = [1, 2, 3, 4];
// 倍率を指定する
$magnification = 3;
$new_numbers = array_map(function($number) use (&$magnification) {
// loopごとに倍率に1を足す
$magnification++;
return $number * $magnification;
}, $numbers);
// 結果
[4, 10, 18, 28]
型指定
型を指定することができます。
指定していないからといってエラーにはならないですが、安全性、保守性の向上を考えると指定しておいたほうが良いです。
例としてLaravelのEloquentsを使用します。
<?php
$persons = App\Person::all();
array_filter($persons, function(Person $person) {
// IDEによってはgenderに補完が効き、定義元へジャンプできるようになる。
return $person->gender == '男子';
});
Laravel使用例
最後にLaravelのCollectionでよく使うので紹介します。
collect(['太郎', null, '次郎'])
->reject(function ($name) {
// 名前がない要素を除外
return empty($name);
})
->map(function ($name) {
// 末尾に「さん」をつける
return $name . 'さん';
})
->values();
※values()
を使うことでキーをリセットしてくれます。
公式ドキュメントのweb内検索でfunction()
と検索するとどのような場面でfunction()を使用しているかわかるので参考になります。
https://readouble.com/laravel/5.8/ja/collections.html