(PHP 5 >= 5.4.0, PHP 7)
Closure::bindTo — 新しくバインドしたオブジェクトとクラスのスコープで、クロージャを複製する
自身と同じ本体とバインド変数を持つ新しい 無名関数 を作って返します。しかし、バインドするオブジェクトは変わって新しいクラスのスコープとなります。
“バインドするオブジェクト” によって、$this
が関数本体で持つ値が決まり、“クラスのスコープ”
は、無名関数からどのクラスの private メンバーや protected メンバーにアクセスできるのかが決まります。
すなわち、無名関数から見えるメンバーは、
その無名関数が newscope
クラスのメソッドであった場合と同じものになります。
静的なクロージャは何もオブジェクトをバインドできません
(newthis
の値は NULL
でなければなりません) が、
それでもこの関数を使ってクラスのスコープを変えることができます。
この関数が静的でないクロージャに関して保証するのは、
バインドされたインスタンスを持っていればスコープ内にあるということです。
また、その逆も成り立ちます。そのため、静的でないクロージャにスコープとして
NULL
インスタンスを渡すとそれは静的となり、静的でなくスコープにもないクロージャに
NULL
でないインスタンスを渡すと、特定されていない何らかのクラスのスコープに入ります。
注意:
単に無名関数を複製したいだけの場合は、 cloning を使うこともできます。
newthis
指定した無名関数をバインドするオブジェクト。クロージャのバインドを解除するには
NULL
を指定します。
newscope
クロージャを関連づけるクラススコープ、あるいは 'static' で現在のスコープを維持します。 オブジェクトを渡した場合は、そのオブジェクトの型をその代わりに使います。 これは、バインドしたオブジェクトの protected メソッドや private メソッドの可視性を決めます。 It is not allowed to pass (an object of) an internal class as this parameter.
新しい Closure オブジェクトを返します。
失敗した場合に FALSE
を返します
バージョン | 説明 |
---|---|
7.0.0 |
newscope can not be (an object of) an internal
class anymore, what was possible prior to this version.
|
例1 Closure::bindTo() の例
<?php
class 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