我有一个 var,我需要知道它是一个闭包还是只是一个常规字符串、数组等。当然我可以
is_array()
is_string()
is_bool()
is_null()
is_resource()
is_object()
no? must be a closure?
请注意,
is_callable()
可以在非闭包的情况下返回 true —— 例如包含函数名称的字符串、引用类和方法的数组,或者实现 __invoke()
的对象实例:
var_dump(is_callable('sort'));
这产生:
bool(true)
你可能会做这样的事情,但我不确定它会涵盖所有情况:
function is_closure($thing): bool
{
return
!is_string($thing) &&
!is_array($thing) &&
!is_object($thing) &&
is_callable($thing);
}
如果您需要实际找到闭包与可调用对象,反射可能是最好的:
function is_closure($thing): bool
{
try {
return (new ReflectionClass($thing))->getName() === 'Closure';
} catch (\Throwable $e) {
return false;
}
}
$thing = new stdClass();
var_dump(is_closure($thing));
$thing = function () { return 0; };
var_dump(is_closure($thing));
$thing = 'a string';
var_dump(is_closure($thing));
$thing = [1, 2, 3];
var_dump(is_closure($thing));
bool(false)
bool(true)
bool(false)
bool(false)
https://www.php.net/manual/en/functions.anonymous.php 说:
匿名函数
匿名函数是使用 Closure 类实现的。
https://www.php.net/closure 说:
闭包类
用于表示匿名函数的类。
所以它们是完全等价的。确实:
–
get_class( function(){})
返回字符串 'Closure'
,function(){} instanceof Closure
是 true
,