PHPの無名関数（クロージャ）とアロー関数の基礎を学ぶ

本記事は、独学エンジニアという学習サイトで学んだ内容をもとに、PHPの無名関数（クロージャ）とアロー関数について学んだ内容を自分用の備忘録としてまとめたものです。

https://dokugaku-engineer.com/course/serverside

---

### **概要**

無名関数を使うと、以下のメリットがあります：

- **関数を変数として扱える**
- **コールバック関数として使いやすい**
- **一度しか使わない処理を簡潔に書ける**
- **スコープを制御しやすい**

また、**JavaScript** などの他の言語でもよく使われる概念なので、理解しておくと応用が効きます。

---

## **1. 無名関数とは？**

無名関数とは、**関数名を持たず、値として扱える関数** です。

無名関数は **クロージャ（Closure）** とも呼ばれます。

### **通常の関数**

```php
function double($num) {
    return $num * 2;
}
echo double(5); // 出力: 10

```

### **無名関数**

```php
$double = function($num) {
    return $num * 2;
};
echo $double(5); // 出力: 10

```

**ポイント**

- **`function` の後に関数名がない**
- **変数 `$double` に関数を代入**
- **`;` を忘れずに付ける**
- **変数経由で関数を実行できる**

---

## **2. コールバック関数として使う**

無名関数は、**関数の引数として渡す** ことで、

**「この関数を適用する」** という書き方ができます。

### 通常の方法（関数を定義してから渡す）

```php
function double($num) {
    return $num * 2;
}

$numbers = [1, 2, 3];
$doubled = array_map("double", $numbers);
print_r($doubled); // 出力: [2, 4, 6]

```

### 無名関数を使う

```php
$numbers = [1, 2, 3];

$doubled = array_map(function($num) {
    return $num * 2;
}, $numbers);

print_r($doubled); // 出力: [2, 4, 6]

```

**ポイント**

- `array_map()` の **第一引数に関数を直接渡せる**
- **関数を事前に定義しなくてOK** なので、コードがスッキリ！

---

## **3. 親スコープの変数を使う（`use` キーワード）**

無名関数は **外部の変数をそのまま使えません**。

変数を関数内で使いたい場合は **`use`** を使います。

### **`use` を使わない場合（エラーになる）**

```php
$multiplier = 3;

$tripled = array_map(function($num) {
    return $num * $multiplier; // エラー: 未定義の変数
}, [1, 2, 3]);

```

### **`use` を使う**

```php
$multiplier = 3;

$tripled = array_map(function($num) use ($multiplier) {
    return $num * $multiplier;
}, [1, 2, 3]);

print_r($tripled); // 出力: [3, 6, 9]

```

**ポイント**

- **`use ($変数名)` で親スコープの変数を使える**
- `$multiplier` は関数の外で定義されているが、関数内でも使えるようになる

---

## **4. 無名関数をさらに簡潔に「アロー関数」**

PHP 7.4 から **「アロー関数（Arrow Function）」** が使えます。

アロー関数は **`fn` を使い、`=>` で処理を記述** します。

### **アロー関数の基本**

```php
$double = fn($num) => $num * 2;
echo $double(5); // 出力: 10

```

### **無名関数 vs アロー関数**

```php
// 無名関数
$squared = function($num) {
    return $num ** 2;
};

// アロー関数
$squared = fn($num) => $num ** 2;

```

**ポイント**

- **`fn` を使うと `{}` や `return` を省略できる**
- **親スコープの変数が `use` なしで使える**
- **短い処理にはアロー関数が便利！**

---

## **5. アロー関数は `use` なしで親の変数を使える**

通常の無名関数では `use` を使わないとエラーになりますが、

アロー関数では **自動的に親スコープの変数を引き継ぎます**。

### **無名関数（`use` が必要）**

```php
$multiplier = 3;

$tripled = array_map(function($num) use ($multiplier) {
    return $num * $multiplier;
}, [1, 2, 3]);

print_r($tripled); // 出力: [3, 6, 9]

```

### **アロー関数（`use` 不要）**

```php
$multiplier = 3;

$tripled = array_map(fn($num) => $num * $multiplier, [1, 2, 3]);

print_r($tripled); // 出力: [3, 6, 9]

```

**ポイント**

- **アロー関数は `use` を使わなくても親スコープの変数が使える**
- **よりシンプルに記述できる**

---

## **6. 無名関数とアロー関数の使い分け**

| 種類 | 特徴 | 使いどころ |
| --- | --- | --- |
| **無名関数** | 通常の関数と同じように `{}` で処理を書く | コールバック関数やスコープを意識する場合 |
| **アロー関数** | `fn` を使って `=>` で簡潔に記述できる | 短い処理をシンプルに書きたい場合 |
- **基本の考え方**
- **短い処理なら `fn` を使う**
- **複雑な処理や `return` を使いたいなら無名関数を使う**
- **親スコープの変数を使うならアロー関数の方が簡単**

---

## **7. まとめ**

### **今回学んだこと**

1. **無名関数（クロージャ）とは？**
    - **関数名を持たずに、変数に格納して使える関数**
    - **関数の引数として渡す（コールバック関数）**
2. **親スコープの変数を使うには？**
    - **無名関数では `use` を使う**
    - **アロー関数なら `use` なしでOK**
3. **アロー関数のメリット**
    - **短く書ける (`fn` を使う)**
    - **親スコープの変数を `use` なしで使える**
    - **シンプルな処理に向いている**

---
まとめた内容は以上です。

無名関数やアロー関数は、関数をより柔軟に使いこなすための重要なスキルだと感じました。
特にコールバック関数やスコープの扱いを理解することで、実践的なコード設計ができるようになると思います。

本記事がPHP学習中の方の理解の一助になれば幸いです。

ここまで読んでいただきありがとうございました。