Closure::bindTo

(PHP 5 >= 5.4.0, PHP 7)

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

説明

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

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

“バインドするオブジェクト” によって、$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 {
    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

参考