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