使用以下函数:
function is_closure($t) { return ( !is_string($t) && is_callable($t)); }
除了匿名闭包函数,这个函数还能返回true吗?如果是这样,确定变量是否是闭包的正确方法是什么?
多谢
检查回调是否是实际闭包的最确定方法是:
function is_closure($t) {
return $t instanceof Closure;
}
在PHP中,所有匿名函数都表示为Closure
类型的对象。(回到上面的评论,碰巧实现了__invoke()
方法)
我认为您可以使用instanceof Closure
,尽管手册中说不应该依赖它。.
匿名函数目前使用Closure类实现。这是一个实现细节,不应该依赖。
关闭手册页已经更新了它的指导。现在看来,这种行为是可以信赖的。
在PHP 5.3中实现的匿名函数产生这种类型的对象。这个事实过去被认为是实现细节,但现在可以依赖它。
php.net建议使用反射来确定变量是否包含有效的闭包
我使用这个小助手
function isClosure($suspected_closure) {
$reflection = new ReflectionFunction($suspected_closure);
return (bool) $reflection->isClosure();
}
反射支持此功能http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php
如果您得到关于不存在ReflectionFunction
的错误,请在class前使用反斜杠
// Closure
$closure = function () {};
$reflection = new ReflectionFunction($closure);
// checkout if it is a closure
$test->isTrue($reflection->isClosure());