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";
?>