Php/docs/closure.bindto

提供:Dev Guides
< Php
移動先:案内検索

Closure::bindTo

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

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


説明

public Closure::bindTo ( object $newthis [, mixed $newscope = "static" ] ) : Closure|false

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

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

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

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

注意:

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

パラメータ

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


返り値

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


例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

参考