php is_function()确定变量是否为函数


88

我很高兴读到php中的匿名函数,它使您可以声明一个比使用create_function更容易使用的函数。现在,我想知道是否有一个传递了变量的函数,如何检查它以确定它是否是一个函数?还没有is_function()函数,当我对作为函数的变量进行var_dump时:

$func = function(){
    echo 'asdf';
};
var_dump($func);

我得到这个:

object(Closure)#8 (0) { } 

关于如何检查这是否有功能的任何想法?

Answers:


139

使用is_callable来确定给定的变量是否是一个函数。例如:

$func = function()
{  
    echo 'asdf';  
};

if( is_callable( $func ) )
{
    // Will be true.
}

10
无论您要传递匿名函数,作为字符串的函数名称还是有效的PHP回调数组,is_callable()都将非常有用。如果您只想检查匿名函数,那么您会想要像Gumbo所说的:确保参数是一个对象,并确保它是Closure的实例。

2
如果我想检查它是Callack还是字符串,并为它们执行其他操作,该怎么办。我不希望将字符串值意外地用作回调。
Gherman 2014年

2
@German只检查第一,如果IS_STRING($ FUNC),然后与is_callable($ FUNC)第二次检查
Heroselohim

4
上面的代码片段给我带来了麻烦。我打算使用一个标记为“ Date”的字符串,然后将其作为闭包进行处理并执行。正确的方法是if((($ variable instanceof Closure)&& is_callable($ variable)){...}
Basil Musa

1
为什么闭包AND的实例是可调用的。什么时候不能调用闭包?如果有时间的话不会感到惊讶,但是我很好奇为什么我们需要同时进行两次检查。
Joel M

34

您可以使用function_exists检查是否存在具有给定名称的函数。并将其与匿名函数结合使用,请尝试以下操作:

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}

谢谢你!我的应用程序允许用户指定自己的哈希函数,或为hash()提供参数。但是一些有效的哈希算法也是PHP内置的,因此可以调用(例如'md5','sha1')。is_object()并且instanceof Closure是一种更强大的检查方法!
njbair 2012年

删除is_string和function_exists调用,这是您要用于检测lambda函数的函数。谢谢!
2013年

28

如果只想检查变量是否是匿名函数,而不是可调用的字符串或数组,请使用instanceof

$func = function()
{  
    echo 'asdf';  
};

if($func instanceof Closure)
{
    // Will be true.
}

匿名函数(在PHP 5.3中添加的那种)始终是Closure该类的实例,并且该类的每个实例Closure都是一个匿名函数。

PHP中还有另一种类型的事物可以被认为是一个函数,并且是实现__invokemagic方法的对象。如果要包括这些内容(尽管仍排除字符串和数组),请使用method_exists($func, '__invoke')。这将仍然包括闭包,因为闭包实现__invoke了一致性。


8
这特别有用,因为is_callable()它将尝试根据传递的字符串或数组来查找要调用的方法,这可能会自动加载类,并且可能不是您期望/要求的行为。
spikyjt 2015年

2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}

将来,PHP可能会像其他语言一样将gettype()从Object更改为Callable。因此,此答案可能是最好的方法。但这可以优化为:return!is_string($ f)&&!is_array($ f)&& is_callable($ f)。
Alexandre T.

0

在php中,有效的可调用对象可以是函数,函数名称(字符串)和形式的数组['className', 'staticMethod'][$object, 'method'],因此要检测仅函数,需要排除字符串和数组:

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.