web-dev-qa-db-ja.com

変数が有効なクロージャであるかどうかを判断するPHP

次の関数を使用します。

function is_closure($t) { return ( !is_string($t) && is_callable($t)); }

これは、匿名のクロージャ関数以外の何かに対してtrueを返すことができますか?もしそうなら、変数がクロージャであるかどうかを判断する正しい方法は何でしょうか?

どうもありがとう

27
Silver Dragon

コールバックが実際のクロージャであるかどうかを確認する最も決定的な方法は次のとおりです。

_function is_closure($t) {
    return $t instanceof Closure;
}
_

すべての無名関数は、PHPではタイプClosureのオブジェクトとして表されます。 (上記のコメントに戻ると、たまたま__invoke()メソッドが実装されています。)

51
mario

manual はこれに頼るべきではないと述べていますが、instanceof Closureを使用できると思います。今のところ動作すると思います

匿名関数は現在、Closureクラスを使用して実装されています。これは実装の詳細であり、信頼すべきではありません。

UpdateClosure マニュアルページ これに関するガイダンスを更新しました。この振る舞いは今や信頼できるようです。

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

14
Phil

php.netは、リフレクションを使用して、変数に有効なクロージャが含まれているかどうかを判断することを提案しています

私はこの小さなヘルパーを使用します

function isClosure($suspected_closure) {
    $reflection = new ReflectionFunction($suspected_closure);

    return (bool) $reflection->isClosure();
}
2
Vad.Gut

これはReflectionでサポートされています http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php

1
Shire

ReflectionFunctionが存在しないというエラーが発生した場合は、クラスの前にバックスラッシュを使用してください。

// Closure
$closure = function () {}; 
$reflection = new \ReflectionFunction($closure);
// checkout if it is a closure
$test->isTrue($reflection->isClosure());
0
jjoselon