如果变量是PHP中的有效闭包,则确定

时间:2011-08-18 01:39:03

标签: php reflection closures

使用以下功能:

function is_closure($t) { return ( !is_string($t) && is_callable($t)); }

除了匿名闭包函数之外,还能为其他任何东西返回true吗?如果是这样,如果变量是闭包,那么确定的正确方法是什么?

非常感谢

5 个答案:

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