0
0

More than 3 years have passed since last update.

PHPの無名関数を使ってみた

Posted at

無名関数とは?

公式ドキュメントの引用です。

無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0