is_callable
将可调用名称作为字符串作为第三个参数(它是一个引用)返回,我们可以使用它来解析名称。如果它包含
::
,它是一个类方法,否则是一个自由函数:
function callable_type( $var ) {
if ( ! is_callable( $var, false, $name) ) {
return 'no callable';
}
if($name === "Closure::__invoke")
return "Closure";
$name = explode("::", $name);
if(count($name) === 1)
return "Free function '" . $name[0] . "'";
return "Class method '" . $name[1] . "' of class '" . $name[0] . "'";
}
用于以下输入:
function fn_a() {}
class Cls {
function fn_b() {}
static function fn_c() {}
}
$callable1 = 'fn_a';
$callable2 = array( new Cls, 'fn_b' );
$callable3 = 'Cls::fn_c';
echo callable_type( $callable1 ) . "\n";
echo callable_type( $callable2 ) . "\n";
echo callable_type( $callable3 ) . "\n";
echo callable_type(function() {}) . "\n";
输出:
Free function 'fn_a'
Class method 'fn_b' of class 'Cls'
Class method 'fn_c' of class 'Cls'
Closure