次の関数を使用します。
function is_closure($t) { return ( !is_string($t) && is_callable($t)); }
これは、匿名のクロージャ関数以外の何かに対してtrueを返すことができますか?もしそうなら、変数がクロージャであるかどうかを判断する正しい方法は何でしょうか?
どうもありがとう
コールバックが実際のクロージャであるかどうかを確認する最も決定的な方法は次のとおりです。
_function is_closure($t) {
return $t instanceof Closure;
}
_
すべての無名関数は、PHPではタイプClosure
のオブジェクトとして表されます。 (上記のコメントに戻ると、たまたま__invoke()
メソッドが実装されています。)
php.netは、リフレクションを使用して、変数に有効なクロージャが含まれているかどうかを判断することを提案しています
私はこの小さなヘルパーを使用します
function isClosure($suspected_closure) {
$reflection = new ReflectionFunction($suspected_closure);
return (bool) $reflection->isClosure();
}
これはReflectionでサポートされています http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php
ReflectionFunction
が存在しないというエラーが発生した場合は、クラスの前にバックスラッシュを使用してください。
// Closure
$closure = function () {};
$reflection = new \ReflectionFunction($closure);
// checkout if it is a closure
$test->isTrue($reflection->isClosure());