PHP 中是否有 is_closure() 函数?

is there an is_closure() function, in PHP?

提问人:Doug Cassidy 提问时间:5/4/2023 最后编辑:War10ckDoug Cassidy 更新时间:11/6/2023 访问量:54

问:

我有一个 var,我需要知道它是闭包还是只是一个常规字符串、数组等。我当然可以

is_array()
is_string()
is_bool()
is_null()
is_resource()
is_object()
no? must be a closure?
PHP 闭包

评论

2赞 Jaquarh 5/4/2023
is_callable()

答:

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/pjoF0
get_class( function(){})'Closure'function(){} instanceof Closuretrue