🍉

クロージャってなぁに👀??

2022/11/14に公開

今回はクロージャについてまとめてみました。

①下記のコードを見てみると、attribute(属性の名前(項目名))、value(属性の値(その項目の値、つまりチェックするデータ))、及び、バリデーションが失敗した場合に呼び出す必要がある$fail(引数で「エラーメッセージ」を指定して呼ぶための関数)を受け取っています。

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
    'title' => [
        'required',
        'max:240',
        function ($attribute, $value, $fail) {
            if ($value === 'foo') {
                $fail('The '.$attribute.' is invalid.');
            }
        },
    ],
]);

②下記のコードを見てみるとメソッドは使われておらず、functionのみで書かれ、そのfunctionを変数に入れています。

$arr = [
    'id'  => 7,
    'item' => function ($num) {
                return $num *  9;
             }
];
$mul_num = 10;

$func_use = function ($num) use ($mul_num) {
    return $num * $mul_num * 9;
};
$func = function ($num) {
    return $num *9;
};

下記のコードの、$funcにはClosureというクラスが入っています。まだ実行はされおらず、Closureというクラスのインスタンスがある状態です。実行はまだ行われていません。
function ($num)の値は動作される瞬間に代入された値で決まります。

$func = function ($num) {
    return $num *9;
};
echo $func(3);

コマンドラインで下記を実行します。

php -r "echo $func(3);;"

↓ すると下記のような"3"という結果が返ってきます。

3%

※コマンドラインで実行した際に (結果)% と返ってきますが、%は特に意味は無いので気にしないでください。

funcの中身に着目してみて下さい。numに9が代入され、実際に実行されます。$funcは実行するものを保存するものであり、実行は後で行われます。

☆その他☆
useを使って、呼び出す前に別の所で使ってた値をクロージャ内で使う。

$num_x = 4;

$func = function ($num) use ($num_x) {
    return $num * $num_x;
}

echo $func(4); 
}

コマンドラインで下記を実行します。

php -r "echo $func(4);;"

↓ すると下記のような"4"という結果が返ってきます。

4%  

※コマンドラインで実行した際に (結果)% と返ってきますが、%は特に意味は無いので気にしないでください。

【まとめ】
上記で解説した①や②のコードを無名関数やクロージャと呼びます。

Discussion

ログインするとコメントできます