php回调函数-php中的反弹函数

*2. 2个执行反弹的函数

*提示:哪些是退回邮件?

* 我们把php系统提供的功能称为直接调用,也叫:直接调用

*php系统调用用户自定义函数,必须通过代理函数来调用,称为间接调用php回调函数,也称为反弹

*明天我们要学习的call_user_func()和call_user_func_array()就是这样的代理函数

*可以代替系统调用我们自定义的函数

*1.call_user_func_array($callback,$array):使用链表参数执行反弹函数

*2.call_user_func($callback,$array):第一个参数作为反弹函数调用

*注:1.一般不需要在反弹中写入参数,而是通过其他函数获取; 2.参数不允许通过引用传递

//1. 参数一一传入使用:call_user_func()

//单个参数

echo call_user_func(function(){
    //如果匿名回调没写参数,可以通过func_get_args()获取
    return '欢迎来到'.func_get_arg(0);
},'微课江湖');
echo '
'; echo call_user_func(function($site){ return '欢迎来到'.$site; },'微课江湖'); echo '
';

//多个参数,形参和反弹参数的个数必须一致,多余的会被忽略

echo call_user_func(function($site,$course){
    return '欢迎来到'.$site.'学习'.$course.'课程';
},'微课江湖','php');
echo '
'; //支持调用类中的方法做为回调 class Demo1 { //普通方法 public function sum($a, $b) { return $a+$b; } } class Demo2 { //静态方法 public static function multi($a,$b) { return $a*$b; } }

//调用普通方法:反弹必须以字段形式传入 method: [object, 'mode name']

$obj = new Demo1;
echo call_user_func([$obj,'sum'],10,15);

//php5.4+以上,可以简写:

echo call_user_func([(new Demo1()),'sum'],10,15);
echo '
';

//调用静态方法:有string和field两种方法

//String: '类名::方法名'

echo call_user_func('Demo2::multi',10,15);

//链表:[类名,'模式名']

echo '
'; echo call_user_func(['Demo2','multi'],20,5);

//如果有命名空间,只需在类名前添加命名空间字符串即可,或者使用常量__NAMESPACE__

//理解call_user_func()所以call_user_func_array()很简单,只是参数不同

*2. call_user_func_array(回调,数组

*只接受两个参数:bounce、index字段php回调函数,所有传递给bounce的参数都打包到index字段中

*与call_user_func(array, arg1...)的区别仅在于传递参数的形式

*Bounce还支持:字符串函数名、类名、链表、匿名函数

echo '
'; echo call_user_func_array(function(){ //查看传递给回调的参数 // return print_r(func_get_args(),true); $msg = '前端开发的基础知识包括:'; //遍历参数数组 foreach (func_get_args() as $value) { $msg .= $value.','; } //去掉未尾逗号,并替换成感叹号 return rtrim($msg,',').'!'; }, ['html','css','javascript']); echo '
'; class Demo3 { public function func1() { return __METHOD__.'
'.print_r(func_get_args(),true).'

';}}classDemo4{publicstaticfunctionfunc2(){return__METHOD__。'

'.print_r(func_get_args(),true).'

';}}

//bounce类中的方法

echo call_user_func_array([(new Demo3),'func1'], ['php','java','c']);

//调用静态方法的反弹:

//1. 使用链表参数形式

echo call_user_func_array(['Demo4','func2'], ['html','css','jQuery']);

//2. 使用字符串参数形式

echo call_user_func_array('Demo4::func2', ['html','css','jQuery']);

//如果有命名空间,只需在类名前添加命名空间或__NAMESPACE__