クロージャーのメモ : PHP

Pocket

クロージャーはレキシカルスコープの包含スコープの変数を束縛する関数です。
クロージャーは無名関数として作成する必要があります。
(後述するようにPHPでは無名関数と訳されるものと匿名関数とやくされるものは異なります。)

クロージャー

$x = 0;
$c = function() use(&$x) {
    echo ++$x;
};
$c(); // 1
$c(); // 2
$c(); // 3

以下は構文エラーの例です。

$x = 0;
// 無名関数で定義していません。
function c() use(&$x) {  // Parse error:  syntax error, unexpected 'use' (T_USE),
    echo ++$x;
}
$c();
$c();
$c();

クロージャーのサンプル。

<?php
function make_counter($count)
{
    return function () use (&$count) {  // $countはクロージャー内で変更されるため参照渡しにする必要があります。
        return ++$count;
    };
}

$counter = make_counter(0);
echo $counter(); // 1
echo $counter(); // 2
echo $counter(); // 3

例2

<?php
$total = array_map(
    call_user_func(
        function ($tax) {
            return function ($x) use ($tax) {
                return $x * $tax;
            };
        },
        1.08
    ),
    [100, 200, 300]
);
var_dump($total);
array (size=3)
  0 => float 108
  1 => float 216
  2 => float 324

クロージャー(無名関数)と匿名関数の違い

PHPではクロージャーを無名関数ともよびます。
またcreate_functionで作成した関数を匿名関数と呼びます。

名前 種類 内容
無名関数 クロージャーです。 functionキーワードで作成します。
匿名関数 名前が一意についた関数です。 ceate_function関数で作成します。
// 無名関数はクロージャーなのでuseで包含スコープの変数を束縛できます。
$a = 10;
$foo = function($x) use($a) {
    echo $a + $x;
};
foo(5); // 15
var_dump($foo);
object(Closure)#1 (2) {
  ["static"]=>
  array(1) {
    ["a"]=>
    int(10)
  }
  ["parameter"]=>
  array(1) {
    ["$x"]=>
    string(10) "<required>"
  }
}

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。