*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__
发表评论