cccicl
cccicl
发布于 6天前

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_funccall_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()的参数不能为引用传递

©2020 edoou.com   京ICP备16001874号-3