本質的な話題から離れて恐縮ですが・・・
無名関数とクロージャは違う概念だと思うのですが、PHPでは無名関数のことをクロージャと呼ぶのですね。 クローズ(抱える、閉じ込める)しないのにクロージャと呼ぶのが奇妙に思えました。
- 関数 (function)
- 処理のまとまり
- 関数名を付けて定義するのが一般的
- 関数名付き関数を変数に代入したり関数の引数に渡すことができる言語とできない言語がある
- 無名関数 (anonymous function, lambda expression)
- 関数名を持たず、変数に代入したり関数の引数に渡すことができる関数オブジェクト
- 使い終わったら破棄される一時的な関数、使い捨て関数
- クロージャ (closure)
- 外部変数を抱えた(クローズした)関数
- 引数以外の変数を保持し続けることができる
- 関数内関数や無名関数で定義できる
https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3
引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。
その定義環境のスコープ内の変数にアクセスできる関数オブジェクトです。本質的に、クロージャは「周囲の状態を記憶する関数」と言えます。
PHPで外部変数を抱えるときは use
を使うのですね。
use
を使うのが本来のクロージャの醍醐味かと思います。
<?php
// 税を加えるクロージャを返す
function addTaxClosure(float $rate): Closure {
return function(float $price) use ($rate): float {
return $price * $rate;
};
}
// 通常の税率
$addNormalTax = addTaxClosure(1.10); // 10% 消費税
// 軽減税率
$addReducedTax = addTaxClosure(1.08); // 8% 軽減税率
echo "通常税率: " . $addNormalTax(1000) . PHP_EOL; // 1100
echo "軽減税率: " . $addReducedTax(1000) . PHP_EOL; // 1080
通常税率: 1100
軽減税率: 1080