0

查找对象是否为匿名函数的正确方法是什么?

if (is_object($value) and method_exists($value, '__invoke'))
    $value();

1000000 次迭代,时间:3.27 s,或

if (is_object($value) and $value instanceof Closure)
    $value();

1000000 次迭代,时间:1,71 s

4

3 回答 3

3

方法的存在__invoke()并不意味着该项目是匿名函数。任何类都可以实现该方法,并且实例将是可调用的。

假设“匿名函数”是指使用没有名称(docs)的函数声明语法创建的函数 - 而不是旧create_function()的 - 手册(所有知识的字体)状态(强调我的):

在 PHP 5.3 中实现的匿名函数产生这种 [Closure] 类型的对象。这个事实曾经被认为是一个实现细节,但现在可以依赖它。

http://php.net/manual/en/class.closure.php

于 2013-03-23T13:06:45.123 回答
0

我通常只是去:

if ($value instanceof Closure)
{
    $value();
}
于 2013-03-23T12:59:53.150 回答
0

你的例子并不相同。具有 __invoke 魔术方法的对象可能不是闭包。所以如果你只想要闭包检查闭包。如果您想要所有可调用对象,请检查可调用对象。

您可以使用Callable 类型提示或使用is_callable 函数

于 2013-03-23T15:38:26.663 回答