7

私はクロージャークラスについて理解しようとしています、マニュアルにあります、すべてマニュアルリンクにあります、

Closure::__construct-インスタンス化を禁止するコンストラクター。私が正しく理解していれば、このクラスの唯一のインスタンスは無名関数変数の代入です。

しかし、私はいくつかの行を理解していませんでした:

Closure :: bind —特定のバインドされたオブジェクトとクラススコープでクロージャを複製します。

Closure :: bindTo —新しいバインドされたオブジェクトとクラススコープでクロージャを複製します。

そして最後のマニュアルで私はこの文を理解していませんでした:

ここにリストされているメソッドに加えて、このクラスには__invokeメソッドもあります。このメソッドは関数の呼び出しには使用されないため、これは呼び出しマジックを実装する他のクラスとの一貫性を保つためです。

誰かが私にこれらの行を説明してみてください私は非常に感謝します、良い一日を。

4

2 に答える 2

8

それは呼び出し魔法を指します。

__invoke私の理解では、そのインスタンスが関数であるかのように呼び出すことができるメソッドを含むクラスの場合。そのClosure::__invokeような行為。

つまり、$fooがクラスClosure(匿名関数)の場合、呼び出し$foo($bar)は呼び出します$foo->__invoke(bar)__invokeメンバーは直接呼び出されることを意図していませんが、これはそれがどのように機能するかを示すためだけのものです)。

無名関数を定義するときは、次のようにします。

$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

さて、$greetクラスClosureです。と$greet->__invoke同じようなものですfunction($name){ printf("Hello %s\r\n", $name); }

そして覚えておいてください、それClosure::__invoke魔法の方法です。

于 2012-07-21T12:50:26.547 に答える
3

との違いは、その呼び方にあるbindと思います。bindTo

$cl->bindTo($obj)

と同等です

Closure::bind($cl, $obj)

ミーソッドに関しては、__invokeその方法は存在すると言っていますが、実際には使われていません。クロージャを関数として使用する場合、メソッドをバイパスする内部(おそらくより効率的な)メカニズムが使用されます。ただし、このメソッドは、呼び出し可能な他のクラスとの互換性のためにあり、必要に応じて手動で呼び出すことができます。

于 2012-07-21T12:56:54.807 に答える