2010-05-14 113 views
70

我很兴奋地阅读关于anonymous functions在PHP中,它让你声明一个变量,功能比你可以做的更容易create_function。现在我想知道如果我有一个函数传递一个变量,我该如何检查它以确定它是否是一个函数?没有is_function()函数的是,当我做一个变量的的var_dump这是一个功能::php is_function(),以确定一个变量是否是一个函数

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

我得到这个:

object(Closure)#8 (0) { } 

如何检查,如果这有什么想法是一个函数?

回答

109

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

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

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

无论您传入匿名函数,函数名称作为字符串还是有效的PHP回调数组,is_callable()都会很好。如果你特别想要检查匿名函数,那么你会想要类似Gumbo所说的东西:确保参数是一个对象,并确保它是一个实例闭包。 – Lane 2011-11-03 16:21:15

+1

如果我想检查它是犊牛还是绳子,并为它们做不同的事情,该怎么办?我不希望字符串值被意外地作为回调。 – Gherman 2014-08-19 11:26:01

+2

@German首先检查is_string($ func),然后再用is_callable($ func)检查 – Heroselohim 2015-01-08 21:48:53

29

您可以使用function_exists来检查是否有给定名称的函数。而要结合起来,与匿名函数,试试这个:

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

感谢您的支持!我的应用程序允许用户指定自己的散列函数,或者为hash()提供参数。但是一些有效的哈希算法也是PHP内建的,因此可以调用(例如'md5','sha1')。 'is_object()'和'instanceof Closure'是一个更强大的方法来检查这个! – njbair 2012-12-22 18:50:31

+0

删除is_string和function_exists调用,这是您想用来检测lambda函数的函数。谢谢! – jack 2013-09-10 13:22:00

17

如果你只是想检查变量是否是一个匿名函数,而不是一个可调用的字符串或数组,使用instanceof。 (在PHP 5.3中添加的那种)

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

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

匿名函数总是Closure类的实例,以及Closure类的每个实例是一个匿名函数。

在PHP中还有另外一种类型的东西可以被认为是一种功能,那就是实现了神奇方法的对象。如果你想包括那些(但仍然排除字符串和数组),请使用method_exists($func, '__invoke')。这仍将包括关闭,因为为了一致性,关闭实施__invoke

+4

这是特别有用的,因为'is_callable()'会尝试根据传递的字符串或数组寻找一个方法来调用,这可能会自动加载类,并且可能不是您期望/需要的行为。 – spikyjt 2015-02-16 10:12:58

0
function is_function($f) { 
    return is_callable($f) && !is_string($f); 
} 
相关问题