判断一个变量在PHP中是否是一个有效的闭包


Determining, if a variable is a valid closure in PHP

使用以下函数:

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());