PHPのClosure

2075 ワード

PHPのClosure
Closure、匿名関数、Anonymous functionsとも呼ばれ、php 5.3の時に導入しました.匿名関数とは、名前が定義されていない関数です.これをしっかり覚えておくと匿名関数の定義が理解できます.
例えば次のコード
function test() {
    return 100;
};

function testClosure(Closure $callback)
{
    return $callback();
}

$a = testClosure(test());
print_r($a);exit;

ここでtest()は、「匿名」関数ではないため、testClosureのパラメータとして使用することはできません.
このように変更する必要があります
$f = function () {
    return 100;
};

function testClosure(Closure $callback)
{
    return $callback();
}

$a = testClosure($f);
print_r($a);exit;

はい、クラスの匿名関数を呼び出すとしたら?
class C {
    public static function testC() {
        return function($i) {
            return $i+100;
        };
    }
}

$f = function ($i) {
    return $i + 100;
};

function testClosure(Closure $callback)
{
    return $callback(13);
}

$a = testClosure(C::testC());
print_r($a);exit;

C::testC()はfuncitonを返します.
バインドの概念
上の例のClosureはグローバルな匿名関数にすぎません.では、クラスに匿名関数があることを指定したいと思います.この匿名関数のアクセス範囲はグローバルではなく、クラスのアクセス範囲であることも理解できる.
では、「匿名関数をクラスにバインドする」必要があります.
base + 3;
};


$a = Closure::bind($f, new A);
print_r($a());

echo PHP_EOL;

$b = Closure::bind($f, new B , 'B');
print_r($b());

echo PHP_EOL;

上の例では、(fという匿名関数に奇妙な名前がある)this、このthisキーワードは、この匿名関数がクラスにバインドされる必要があることを示しています.
バインド後、Aにこのような関数があるようになりますが、この関数がpublicなのかprivateなのか、bindの最後のパラメータはこの関数の呼び出し可能な範囲を説明します.
bindToの場合、例を見てください.
base + 3;
};

$sf = static function() {
    return self::$base + 3;
};


$a = Closure::bind($f, new A);
print_r($a());

echo PHP_EOL;

$b = Closure::bind($f, new B , 'B');
print_r($b());

echo PHP_EOL;

$c = $sf->bindTo(null, 'C');
print_r($c());

echo PHP_EOL;