0Pricing
PHP Academy · レッスン

匿名関数とクロージャ

インライン関数を記述し、useで変数をキャプチャします。

「匿名関数とクロージャ」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

無名関数とは

無名関数(ラムダ)とは、名前のない関数です。PHPでは組み込みのClosureクラスのインスタンスであり、変数に格納したり、引数として渡したり、別の関数から返したりできます。

基本的な無名関数

関数を変数に代入して呼び出します。

<?php
$double = function(int $n): int {
    return $n * 2;
};

echo $double(5);   // 10
echo $double(21);  // 42

無名関数を渡す

クロージャをarray_mapやusortなどの関数、または独自のコールバックに引数として渡せます。

<?php
$nums = [3, 1, 4, 1, 5, 9];

$squared = array_map(function(int $n): int {
    return $n ** 2;
}, $nums);

print_r($squared); // [9, 1, 16, 1, 25, 81]

関数を返す

関数でクロージャを作成して返すことができます。これはファクトリパターンです。

<?php
function makeMultiplier(int $factor): Closure {
    return function(int $n) use ($factor): int {
        return $n * $factor;
    };
}

$triple  = makeMultiplier(3);
$tenX    = makeMultiplier(10);

echo $triple(5);   // 15
echo $tenX(5);     // 50

クロージャとuse

クロージャはuseを使って外側のスコープから変数をキャプチャできます。&を付けない限り、キャプチャは値(コピー)によって行われます。

<?php
$taxRate = 0.18;

$addTax = function(float $price) use ($taxRate): float {
    return $price * (1 + $taxRate);
};

$taxRate = 0.20;  // change outer variable
echo $addTax(100); // 118 — captured value at creation time

use(&amp;)による参照キャプチャ

外側の変数の更新をクロージャから確認できるようにするには、参照でキャプチャします。

<?php
$count = 0;

$increment = function() use (&$count): void {
    $count++;
};

$increment();
$increment();
echo $count;  // 2

アロー関数(PHP 7.4)

アロー関数は、外側のスコープを値で自動的にキャプチャする、簡潔な単一式のクロージャです。

<?php
$rate = 1.18;
$prices = [10, 20, 30];

// Arrow function — no 'use' needed
$withTax = array_map(fn($p) => $p * $rate, $prices);

print_r($withTax); // [11.8, 23.6, 35.4]

アロー関数では外側のスコープを変更できません

アロー関数は値によるキャプチャだけを行うため、外側の変数を変更できません。

<?php
$total = 0;
$nums  = [1, 2, 3];

// This does NOT modify $total!
array_walk($nums, fn($n) => $total += $n);

echo $total;  // 0

// Use a reference closure for mutation:
array_walk($nums, function($n) use (&$total) { $total += $n; });
echo $total;  // 6

コールバックとしてのクロージャ

多くのPHP関数はcallableを受け取ります。クロージャ、配列[$obj, 'method']、または文字列の関数名を渡せます。

<?php
$words = ['banana', 'apple', 'cherry'];

usort($words, fn($a, $b) => strcmp($a, $b));

print_r($words); // ['apple', 'banana', 'cherry']

即時実行クロージャ

クロージャは同じ行で定義して呼び出すことができます。独立したスコープを作成する場合に便利です。

<?php
$result = (function(): int {
    $x = 10;
    $y = 20;
    return $x + $y;
})();

echo $result; // 30
// $x and $y are not in outer scope

Closure::bindとbindTo

Closure::bind()を使うと、クロージャを別のオブジェクトのコンテキストに再バインドできます。

<?php
class Counter {
    private int $value = 0;
}

$increment = Closure::bind(function(int $by): void {
    $this->value += $by;
}, new Counter(), Counter::class);

// Now $increment has access to private $value

クイックチェック

PHPにおいて、useを使う通常のクロージャとアロー関数の主な違いはどれですか。

まとめ:無名関数とクロージャ

まとめ:

  • 無名関数は変数に格納して、さまざまな場所に渡せます
  • クロージャはuse($var)(値による)またはuse(&$var)(参照による)で外側の変数をキャプチャします
  • アロー関数(PHP 7.4)は外側のスコープを値で自動的にキャプチャします
  • array_map、usort、array_filterなどのコールバックに便利です
  • ファクトリ関数から返すことができます

よくある質問

「匿名関数とクロージャ」レッスンは無料ですか?

はい。「匿名関数とクロージャ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「匿名関数とクロージャ」で何を学びますか?

インライン関数を記述し、useで変数をキャプチャします。 ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「匿名関数とクロージャ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 関数の定義と呼び出し
  2. デフォルトパラメーターと可変長パラメーター
  3. 変数のスコープ:ローカルとグローバル
  4. 匿名関数とクロージャ
← PHP Academyに戻る