我很高兴在php中阅读anonymous functions,它让你声明一个函数比使用create_function更容易的变量。现在我想知道我是否有一个传递变量的函数,我如何检查它以确定它是否是一个函数?还没有is_function()函数,当我做一个变量的var_dump是一个函数::
$func = function(){
echo 'asdf';
};
var_dump($func);
我明白了:
object(Closure)#8 (0) { }
有关如何检查这是否是一个功能的任何想法?
答案 0 :(得分:120)
使用is_callable
确定给定变量是否为函数。例如:
$func = function()
{
echo 'asdf';
};
if( is_callable( $func ) )
{
// Will be true.
}
答案 1 :(得分:30)
您可以使用function_exists
检查是否存在具有给定名称的函数。要将其与匿名函数结合使用,请尝试以下方法:
function is_function($f) {
return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}
答案 2 :(得分:21)
如果您只想检查变量是否是匿名函数,而不是可调用字符串或数组,请使用instanceof
。
$func = function()
{
echo 'asdf';
};
if($func instanceof Closure)
{
// Will be true.
}
匿名函数(在PHP 5.3中添加的类型)始终是Closure
类的实例,Closure
类的每个实例都是匿名函数。
PHP中的另一种类型的东西可以被认为是一个函数,以及实现__invoke
魔术方法的对象。如果要包含这些(但仍排除字符串和数组),请使用method_exists($func, '__invoke')
。这仍将包括闭包,因为闭包实现__invoke
以保持一致性。
答案 3 :(得分:1)
function is_function($f) {
return is_callable($f) && !is_string($f);
}
答案 4 :(得分:0)
在php中,有效的可调用对象可以是函数,函数名(字符串)和格式为['className', 'staticMethod']
或[$object, 'method']
的数组,因此仅检测函数就需要排除字符串和数组:
function isFunction($callable) {
return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}