确定变量在PHP中是否为有效闭包

确定变量在PHP中是否为有效闭包,php,reflection,closures,Php,Reflection,Closures,使用以下功能: 函数is_closure($t){return(!is_string($t)&&is_callable($t))} 对于匿名闭包函数以外的任何其他函数,这是否可以返回true?如果是这样,那么确定变量是否为闭包的正确方法是什么 非常感谢检查回调是否为实际闭包的最确定方法是: function is_closure($t) { return $t instanceof Closure; } 在PHP中,所有匿名函数都表示为Closure类型的对象。(回到上面的评论,它恰好

使用以下功能:

函数is_closure($t){return(!is_string($t)&&is_callable($t))}

对于匿名闭包函数以外的任何其他函数,这是否可以返回true?如果是这样,那么确定变量是否为闭包的正确方法是什么


非常感谢

检查回调是否为实际闭包的最确定方法是:

function is_closure($t) {
    return $t instanceof Closure;
}

在PHP中,所有匿名函数都表示为
Closure
类型的对象。(回到上面的评论,它恰好实现了
\uu invoke()
方法。)

我认为您可以使用
instanceof Closure
,尽管不应该依赖于它。我想现在可以了

匿名函数当前使用闭包类实现。这是一个实施细节,不应依赖

更新 关闭已经更新了关于这方面的指导。现在看来,这种行为是可以信赖的

在PHP5.3中实现的匿名函数产生这种类型的对象。这个事实过去被认为是一个实现细节,但现在可以依赖它了


反射支持这一点。php.net建议使用反射来确定变量是否包含有效的闭包

我用这个小助手

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

    return (bool) $reflection->isClosure();
}

如果您得到一个不存在的错误
ReflectionFunction
,请在上课前使用反斜杠

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

对象也可以调用,如果它们实现的话。@mario抢先告诉我了,但我将把这个留在这里,以获得额外的信息(除非mario想把它和他的答案合并在一起),这让我有一两分钟的时间不舒服。。。如果您的代码具有名称空间,请确保转义\close以返回全局名称空间。您不需要执行
is\u object($t)
,对非对象执行
instanceof
将始终返回false。