使用以下功能:
function is_closure($t) { return ( !is_string($t) && is_callable($t)); }
除了匿名闭包函数之外,还能为其他任何东西返回true吗?如果是这样,如果变量是闭包,那么确定的正确方法是什么?
非常感谢
答案 0 :(得分:49)
检查回调是否是实际闭包的最确定的方法是:
function is_closure($t) {
return is_object($t) && ($t instanceof Closure);
}
所有匿名函数都表示为PHP中Closure
类型的对象。 (回到上面的评论,恰好实现了__invoke()
方法。)
答案 1 :(得分:14)
我认为您可以使用instanceof Closure
虽然不应该依赖manual个州。我想它现在 。
目前使用Closure类实现匿名函数。这是一个实现细节,不应该依赖它。
<强>更新强> 封闭manual page已经更新了对此的指导。现在似乎可以依赖这种行为了。
在PHP 5.3中实现的匿名函数会生成此类型的对象。这个事实过去被认为是一个实现细节,但现在可以依赖它了。
答案 2 :(得分:2)
php.net建议使用反射来确定变量是否包含有效的闭包
我使用这个小助手
function isClosure($suspected_closure) {
$reflection = new ReflectionFunction($suspected_closure);
return (bool) $reflection->isClosure();
}
答案 3 :(得分:1)
答案 4 :(得分:0)
如果您收到的错误不存在ReflectionFunction
,请在课前使用反斜杠:
// Closure
$closure = function () {};
$reflection = new \ReflectionFunction($closure);
// checkout if it is a closure
$test->isTrue($reflection->isClosure());