PHP 中有 is_closure() 函数吗?

问题描述 投票:0回答:2

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

is_array()
is_string()
is_bool()
is_null()
is_resource()
is_object()
no? must be a closure?
php closures
2个回答
3
投票

请注意,

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)

0
投票

https://www.php.net/manual/en/functions.anonymous.php 说:

匿名函数
匿名函数是使用 Closure 类实现的。

https://www.php.net/closure 说:

闭包类
用于表示匿名函数的类。

所以它们是完全等价的。确实:

get_class( function(){})
返回字符串
'Closure'
,
function(){} instanceof Closure
true
,
从 PHP 5.3 到 PHP 8.2:
https://3v4l.org/pjoF0

© www.soinside.com 2019 - 2024. All rights reserved.