确定变量在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。