この機能は無名関数と呼ばれ、PHP 5.3 以降で利用できるようになりました。
クロージャとも呼ばれる匿名関数を使用すると、名前が指定されていない関数を作成できます。これらはコールバック パラメータの値として最も便利ですが、他にも多くの用途があります。
それらには、スコープの解像度にも(わずかな)違いがあります。
クロージャーは、親スコープから変数を継承する場合もあります。このような変数は、関数ヘッダーで宣言する必要があります。親スコープから変数を継承することは、グローバル変数を使用することと同じではありません。
したがって、この例では:
$total = 0.00;
$callback = function ($quantity, $product) use ($tax, &$total)
{
$pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
array_walk($this->products, $callback);
...そのドキュメントページから、キーワードを使用せずに ($callback) スコープに効果的$tax
に$total
挿入されます。closure
global
無名関数は、実際にはClosureクラスのオブジェクトです。そして、これは単なる実装機能ではありません: (PHP 5.4 以降) これらの関数は$this
オブジェクト (JavaScript のコンテキスト オブジェクトと同様) を使用できるため、このコンテキストを変更できる便利なメソッドがいくつかあります ( Closure::bind、Closure::bindTo -これらをFunction.bindと比較してください)。
より具体的に言えば、コレクションをmap
/するときに匿名関数を使用することは、実際には良い習慣です。これらの関数はグローバル スコープに入らないからです。filter
しかしもちろん、コードを PHP 5.2 で動作させる必要がある場合、これは解決策ではありません。