2017-09-15 17 views
0

PHPマニュアルではClosure::bind()の説明がほとんどなく、例も混乱していました。閉鎖のためのパラメータ::バインド()は何PHPでClosure :: bind()とは何か

class A { 
private static $sfoo = 1; 
private $ifoo = 2; 
} 
$cl1 = static function() { 
return A::$sfoo; 
}; 
$cl2 = function() { 
return $this->ifoo; 
}; 

$bcl1 = Closure::bind($cl1, null, 'A'); 
$bcl2 = Closure::bind($cl2, new A(), 'A'); 
echo $bcl1(), "\n"; 
echo $bcl2(), "\n"; 

ここでは、サイト上のコード例では、ですか?

上記ではNullが使用されていましたが、「new」キーワードも使用されていました。これはこれをさらに混乱させます。

+3

[bindTo()](http://php.net/manual/ja/closure.bindto.php)を確認してください。ここにいくつかの説明があります。 'bind()'はちょうど静的なバージョンです –

答えて

1

あなたはクラスAの方法として$cl2の値を入れた場合、クラスは次のようになります。

class A { 
    public $ifoo = 2; 

    function cl2() 
    { 
     return $this->ifoo; 
    } 
} 

、あなたはこのようにそれを使用することができます:

$x = new A(); 
$x->cl2(); 
# it prints 
2 

しかし、$cl2理由クロージャであり、クラスAのメンバーではない場合、上記の使用コードは機能しません。

$cl2 = function() { 
    return $this->ifoo; 
}; 

$x = new A(); 
$cl3 = $cl2->bindTo($x); 
echo $cl3(); 
# it prints 2 

$x->ifoo = 4; 
echo $cl3(); 
# it prints 4 now 

閉鎖$cl2で定義されていないが、$this$thisの値を使用する:

方法Closure::bindTo()は、それがクラスAの方法であったとしてクロージャを使用することを可能にします。 $cl2()が実行された場合、$thisNULLであり、エラー("PHP致命的なエラー:オブジェクトコンテキストに含まれていない場合は$thisを使用します")がトリガーされます。

Closure::bindTo()は、新しいクロージャを作成しますが、この新しいクロージャ内の$thisの値を最初の引数として受け取るオブジェクトに「バインド」します。

$cl3に格納されているコードの中には、$thisのグローバル変数$xと同じ値があります。 $cl3()が実行されている場合、$this->ifooは、オブジェクト$xifooの値です。

Closure::bind()は、Closure::bindTo()の静的バージョンです。 Closure::bindTo()と同じ動作をしますが、追加の引数が必要です。最初の引数はバインドするクロージャでなければなりません。

関連する問題