我很高兴读到php中的匿名函数,它使您可以声明一个比使用create_function更容易使用的函数。现在,我想知道是否有一个传递了变量的函数,如何检查它以确定它是否是一个函数?还没有is_function()函数,当我对作为函数的变量进行var_dump时:
$func = function(){
echo 'asdf';
};
var_dump($func);
我得到这个:
object(Closure)#8 (0) { }
关于如何检查这是否有功能的任何想法?
我很高兴读到php中的匿名函数,它使您可以声明一个比使用create_function更容易使用的函数。现在,我想知道是否有一个传递了变量的函数,如何检查它以确定它是否是一个函数?还没有is_function()函数,当我对作为函数的变量进行var_dump时:
$func = function(){
echo 'asdf';
};
var_dump($func);
我得到这个:
object(Closure)#8 (0) { }
关于如何检查这是否有功能的任何想法?
Answers:
使用is_callable
来确定给定的变量是否是一个函数。例如:
$func = function()
{
echo 'asdf';
};
if( is_callable( $func ) )
{
// Will be true.
}
您可以使用function_exists
检查是否存在具有给定名称的函数。并将其与匿名函数结合使用,请尝试以下操作:
function is_function($f) {
return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}
is_object()
并且instanceof Closure
是一种更强大的检查方法!
如果只想检查变量是否是匿名函数,而不是可调用的字符串或数组,请使用instanceof
。
$func = function()
{
echo 'asdf';
};
if($func instanceof Closure)
{
// Will be true.
}
匿名函数(在PHP 5.3中添加的那种)始终是Closure
该类的实例,并且该类的每个实例Closure
都是一个匿名函数。
PHP中还有另一种类型的事物可以被认为是一个函数,并且是实现__invoke
magic方法的对象。如果要包括这些内容(尽管仍排除字符串和数组),请使用method_exists($func, '__invoke')
。这将仍然包括闭包,因为闭包实现__invoke
了一致性。
is_callable()
它将尝试根据传递的字符串或数组来查找要调用的方法,这可能会自动加载类,并且可能不是您期望/要求的行为。
function is_function($f) {
return is_callable($f) && !is_string($f);
}
在php中,有效的可调用对象可以是函数,函数名称(字符串)和形式的数组['className', 'staticMethod']
或[$object, 'method']
,因此要检测仅函数,需要排除字符串和数组:
function isFunction($callable) {
return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}