PHP回调函数call_user_func和call_user_func_array使用
最近将项目的php版本从5.6升级到7.1+后,由于php5中的部分功能在php7中不能使用,比如如下代码$db->$vals[0]($vals[1])
,在php5中可以正常使用,php7中就不能使用了,于是将其代码改为了call_user_func_array(array($db, $vals[0]), $vals[1])
进行调用,完美兼容php5和php7.
以下是call_user_func
和call_user_func_array
方法的使用方法介绍
call_user_func($func);
调用一个回调函数处理字符串,
可以用匿名函数,可以用有名函数,可以传递类的方法,
用有名函数时,只需传函数的名称
用类的方法时,要传类的名称和方法名
传递的第一个参数必须为函数名,或者匿名函数,或者方法
其他参数,可传一个参数,或者多个参数,这些参数会自动传递到回调函数中
而回调函数,可以通过传参,获取这些参数
返回回调函数处理后的结果
1、调用普通函数
//先引用后增加
function a($b){
echo $b + 1;
}
call_user_func('a', 1);#结果显示2
//先增加后引用
call_user_func(function($b){
echo $b + 1;
}, 1);#传给匿名函数的参数为1,执行的结果为2
2、调用类的方法(包括类的静态方法和实例对象方法)
//1、调用没有命名空间的类的方法
class A(){
public function bb($a){
echo $a + 1;
}
public static function cc($i){
echo $i + 2;
}
}
//实例对象后调用
$obj = new A;
call_user_func(array($obj, 'bb'), 1);//显示2
//静态方法使用如下方法调用
call_user_func(array('A', 'cc'), 1);
//或
call_user_func('A::cc', 1);
//2、调用有命名空间的类的方法
namespace Demo;
class A(){
public function _func(){
print_r(func_get_args());//打印函数的参数
}
public static function cc($i){
echo $i + 2;
}
}
//针对普通方法
$obj = new \Demo\A;
call_user_func(array($obj, '_func'), 'a', 1, 2, 'b');
//针对静态方法,两种调用方式
//1、可以用array(__NAMESPACE__.'\类名','方法名')传递类方法,也就是:array('命名空间\类名','方法名')
call_user_func(array(__NAMESPACE__.'\A','cc'), 10);
//2、也可以用__NAMESPACE__.'\类名::方法名' ···传递类方法,也就是:'命名空间\类名::方法名'
call_user_func('Demo\A::cc', 10);
call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰
call_user_func_array($func, $arr);
1、简单函数方法调用
function a($a, $b){
echo $a + $b + 10;
}
call_user_func_array('a', array(1, 2));//13
2、调用类的方法
//无命名空间的类方法调用
class A(){
public function bb($a, $c){
echo $a + $c + 10;
}
public static function cc($a, $b){
echo $a + $b + 20;
}
}
//非静态方法
$obj = new A;
call_user_func_array(array($obj, 'bb'), array(1, 3));//14
//静态方法调用
call_user_func_array(array('A', 'bb'), array(1, 3));
//或
call_user_func_array('A::cc', array(2, 5));//27
//有命名空间的类方法调用
namespace Demo;
class A(){
public function bb($a, $c){
echo $a + $c + 10;
}
public static function cc($a, $b){
echo $a + $b + 20;
}
}
//非静态方法
$obj = new A;
call_user_func_array(array($obj, 'bb'), array(1, 3));//14
//静态方法调用
call_user_func_array(array('\Demo\A', 'bb'), array(1, 3));
//或
call_user_func_array('\Demo\A::cc', array(2, 5));//27
请注意,传入call_user_func()和call_user_func_array()的参数不能为引用传递