查找对象是否为匿名函数的正确方法是什么?
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秒
答案 0 :(得分:3)
__invoke()
方法的存在并不意味着该项是匿名函数。任何类都可以实现该方法,并且实例将是可调用的。
假设“匿名函数”是指使用函数声明语法创建的没有名称(docs) - 而不是旧的create_function()
- 手册(所有知识的字体)状态(强调我的):
在PHP 5.3中实现的匿名函数产生此[Closure]类型的对象。这个事实过去被认为是一个实现细节,但现在可以依赖它。
答案 1 :(得分:0)
我通常会选择:
if ($value instanceof Closure)
{
$value();
}
答案 2 :(得分:0)
你的例子并不平等。具有__invoke魔术方法的对象可能不是Closure。因此,如果您只想要Closures检查闭包。如果你想要所有的callables检查callables。