Closure::bindTo

新しくバインドしたオブジェクトとクラスのスコープで、クロージャを複製する

説明

public Closurenull Closure::bindTo(objectnull $newThis, objectstringnull $newScope = "static")

自身と同じ本体とバインド変数を持つ新しい 無名関数 を作って返します。しかし、バインドするオブジェクトは変わって新しいクラスのスコープとなります。

“バインドするオブジェクト” によって、$this が関数本体で持つ値が決まり、“クラスのスコープ” は、無名関数からどのクラスの private メンバーや protected メンバーにアクセスできるのかが決まります。 すなわち、無名関数から見えるメンバーは、 その無名関数が newScope クラスのメソッドであった場合と同じものになります。

static なクロージャは何もオブジェクトをバインドできません (newThis の値は null でなければなりません) が、 それでもこのメソッドを使ってクラスのスコープを変えることができます。

このメソッドが static でないクロージャに関して保証するのは、 バインドされたインスタンスを持っていればスコープ内にあるということです。 また、その逆も成り立ちます。そのため、static でないクロージャにスコープとして null インスタンスを渡すとそれはstaticとなり、staticでなくスコープにもないクロージャに null でないインスタンスを渡すと、特定されていない何らかのクラスのスコープに入ります。

注意:

単に無名関数を複製したいだけの場合は、 cloning を使うこともできます。

パラメータ

newThis

指定した無名関数をバインドするオブジェクト。クロージャのバインドを解除するには null を指定します。

newScope

クロージャを関連づけるクラススコープ、あるいは 'static' で現在のスコープを維持します。 オブジェクトを渡した場合は、そのオブジェクトの型をその代わりに使います。 これは、バインドしたオブジェクトの protected メソッドや private メソッドのアクセス権を決めます。 内部クラス (のオブジェクト) を をパラメータとして渡すことはできません。

戻り値

新しい Closure オブジェクトを返します。 失敗した場合に null を返します。

例1 Closure::bindTo の例

<?php

class A
{
    private $val;

    public function __construct($val)
    {
        $this->val = $val;
    }

    public function getClosure()
    {
        // このオブジェクトとスコープにバインドしたクロージャを返します。
        return function() {
            return $this->val;
        };
    }
}

$ob1 = new A(1);
$ob2 = new A(2);

$cl = $ob1->getClosure();
echo $cl(), "\n";

$cl = $cl->bindTo($ob2);
echo $cl(), "\n";

?>

上の例の出力は、 たとえば以下のようになります。

1
2

参考