Closure::bindTo
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
Closure::bindTo — 新しくバインドしたオブジェクトとクラスのスコープで、クロージャを複製する
説明
自身と同じ本体とバインド変数を持つ新しい 無名関数 を作って返します。しかし、バインドするオブジェクトは変わって新しいクラスのスコープとなります。
“バインドするオブジェクト” によって、$this
が関数本体で持つ値が決まり、“クラスのスコープ”
は、無名関数からどのクラスの private メンバーや protected メンバーにアクセスできるのかが決まります。
すなわち、無名関数から見えるメンバーは、
その無名関数が newscope
クラスのメソッドであった場合と同じものになります。
静的なクロージャは何もオブジェクトをバインドできません
(newthis
の値は null
でなければなりません) が、
それでもこの関数を使ってクラスのスコープを変えることができます。
この関数が静的でないクロージャに関して保証するのは、
バインドされたインスタンスを持っていればスコープ内にあるということです。
また、その逆も成り立ちます。そのため、静的でないクロージャにスコープとして
null
インスタンスを渡すとそれは静的となり、静的でなくスコープにもないクロージャに
null
でないインスタンスを渡すと、特定されていない何らかのクラスのスコープに入ります。
注意:
単に無名関数を複製したいだけの場合は、 cloning を使うこともできます。
パラメータ
newthis
- 指定した無名関数をバインドするオブジェクト。クロージャのバインドを解除するには
null
を指定します。 newscope
- クロージャを関連づけるクラススコープ、あるいは 'static' で現在のスコープを維持します。 オブジェクトを渡した場合は、そのオブジェクトの型をその代わりに使います。 これは、バインドしたオブジェクトの protected メソッドや private メソッドの可視性を決めます。 内部クラス (のオブジェクト) を をパラメータとして渡すことはできません。
例
例1 Closure::bindTo() の例
<?phpclass A { function __construct($val) { $this->val = $val; } 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