提问人:Doug Cassidy 提问时间:5/4/2023 最后编辑:War10ckDoug Cassidy 更新时间:11/6/2023 访问量:54
PHP 中是否有 is_closure() 函数?
is there an is_closure() function, in PHP?
问:
我有一个 var,我需要知道它是闭包还是只是一个常规字符串、数组等。我当然可以
is_array()
is_string()
is_bool()
is_null()
is_resource()
is_object()
no? must be a closure?
答:
3赞
Alex Howansky
5/4/2023
#1
请注意,可以在非闭包上返回 true,例如包含函数名称的字符串、引用类和方法的数组或实现以下内容的对象实例:is_callable()
__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)
0赞
biziclop
11/6/2023
#2
https://www.php.net/manual/en/functions.anonymous.php 说道:
匿名函数 匿名函数
是使用 Closure 类实现的。
https://www.php.net/closure 说道:
Closure 类 用于表示匿名函数的类
。
所以它们是完全等价的。事实上: – 返回字符串 ,
– 是 ,
从 PHP 5.3 到 PHP 8.2:
https://3v4l.org/pjoF0get_class( function(){})
'Closure'
function(){} instanceof Closure
true
评论
is_callable()