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

Jag*_*age 81 php anonymous-function

我非常兴奋地阅读php中的匿名函数,它允许您声明一个比使用create_function更容易的函数变量.现在我想知道我是否有一个传递变量的函数,我如何检查它以确定它是否是一个函数?还没有is_function()函数,当我做一个函数的变量var_dump时::

$func = function(){
    echo 'asdf';
};
var_dump($func);
Run Code Online (Sandbox Code Playgroud)

我明白了:

object(Closure)#8 (0) { } 
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*cto 131

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

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

if( is_callable( $func ) )
{
    // Will be true.
}
Run Code Online (Sandbox Code Playgroud)

  • 无论您是传入匿名函数,函数名作为字符串还是有效的PHP回调数组,is_callable()都会很有效.如果你只想要检查匿名函数,那么你会想要像Gumbo所说的那样:确保参数是一个对象,并确保它是一个Closure实例. (9认同)
  • 上面的代码片段让我陷入困境.我想要一个标有"Date"的字符串,然后将其作为闭包处理并执行.正确的方法是if(($ variable instanceof Closure)&& is_callable($ variable)){...} (3认同)
  • 如果我想检查它是 callack 还是 string 并为它们做不同的事情怎么办。我不希望意外地将字符串值作为回调。 (2认同)
  • @German先检查is_string($ func)然后再检查is_callable($ func) (2认同)

Gum*_*mbo 32

您可以使用function_exists检查具有给定名称的函数.要将其与匿名函数结合使用,请尝试以下操作:

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*and 23

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

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

if($func instanceof Closure)
{
    // Will be true.
}
Run Code Online (Sandbox Code Playgroud)

匿名函数(在PHP 5.3中添加的类型)始终是Closure类的实例,并且类的每个实例Closure都是匿名函数.

PHP中的另一种类型的东西可以被认为是一个函数,而这是实现__invoke魔术方法的对象.如果要包含这些(但仍然排除字符串和数组),请使用method_exists($func, '__invoke').这仍将包括闭包,因为闭包实现__invoke了一致性.

  • 这特别有用,因为`is_callable()`将尝试根据传递的字符串或数组来查找调用方法,这可能会自动加载类,可能不是您期望/需要的行为. (7认同)