匿名関数とクロージャ
インライン関数を記述し、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 timeuse(&)による参照キャプチャ
外側の変数の更新をクロージャから確認できるようにするには、参照でキャプチャします。
<?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 scopeClosure::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フィードバックを取得できます。ローカル設定は不要です。