0

オブジェクトが匿名関数かどうかを確認する正しい方法は何ですか?

if (is_object($value) and method_exists($value, '__invoke'))
    $value();

1000000 回の反復、時間: 3.27 秒、または

if (is_object($value) and $value instanceof Closure)
    $value();

1000000 回の反復、時間: 1.71 秒

4

3 に答える 3

3

メソッドの存在は__invoke()、アイテムが無名関数であることを意味しません。どのクラスでもそのメソッドを実装でき、インスタンスは呼び出し可能になります。

「匿名関数」とは、名前のない関数宣言構文( docs )で作成されたものを意味すると仮定すると、古いものではなくcreate_function()、マニュアル(すべての知識のフォント)は次のように述べています(私の強調):

PHP 5.3 で実装された無名関数は、この [Closure] 型のオブジェクトを生成します。この事実は、以前は実装の詳細と見なされていましたが、現在では信頼できます。

http://php.net/manual/en/class.closure.php

于 2013-03-23T13:06:45.123 に答える
0

あなたの例は等しくありません。__invoke マジック メソッドを持つオブジェクトは Closure ではない可能性があります。したがって、クロージャーのみが必要な場合は、クロージャーをチェックしてください。すべての呼び出し可能オブジェクトが必要な場合は、呼び出し可能オブジェクトを確認してください。

Callable 型ヒントを使用するか、is_callable functionを使用できます。

于 2013-03-23T15:38:26.663 に答える
0

私は通常、次のようにします:

if ($value instanceof Closure)
{
    $value();
}
于 2013-03-23T12:59:53.150 に答える