94

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

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

我明白了:

object(Closure)#8 (0) { } 

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

4

5 回答 5

150

用于is_callable确定给定变量是否为函数。例如:

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

if( is_callable( $func ) )
{
    // Will be true.
}
于 2010-05-14T16:09:04.633 回答
35

您可以使用function_exists来检查是否存在具有给定名称的函数。并将其与匿名函数结合起来,试试这个:

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}
于 2010-05-14T16:05:02.057 回答
31

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

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

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

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

PHP 中还有另一种类型的东西可以被认为是一个函数,那就是实现__invoke魔法方法的对象。如果你想包括那些(同时仍然排除字符串和数组),使用method_exists($func, '__invoke'). 这仍然包括闭包,因为闭包__invoke是为了一致性而实现的。

于 2014-12-12T23:50:06.187 回答
2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}
于 2017-09-27T12:03:27.333 回答
0

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

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
于 2020-02-27T03:47:10.123 回答