剩奶婪镐靛锋可村拨青灸揭兑
二:两个执行回调的函数
什么是回调?
答:
我们调用php系统提供的函数叫直接调用,也叫: 直调
php系统调用用户自定义的函数,必须要通过一个代理函数来调用,叫间接调用,也叫回调
以下是两个系统定义的函数,用来执行回调
1.call_user_func(callable,args…)
2.call_user_func_array(callable,[…])
新建demo2.php
直调:
<?php function test() { // func_get_arg(0)获取传入的第一个参数 echo "欢迎来到".func_get_arg(0); } //直调:按名调用 echo test('萌面人资料铺');
执行:
改成回调,让系统来调用 系统要通过一个代理函数来完成
<?php function test() { // func_get_arg(0)获取传入的第一个参数 echo "欢迎来到".func_get_arg(0); } //改成回调,让系统来调用 系统要通过一个代理函数来完成 //第一个参数为函数名,第二个参数为传递给函数的值 echo call_user_func('test','萌面人资料铺');
执行:
直接使用匿名函数:
<?php //改成回调,让系统来调用 系统要通过一个代理函数来完成 //第一个参数为函数名,第二个参数为传递给函数的值 echo call_user_func(function(){echo "欢迎来到".func_get_arg(0);},'萌面人资料铺');
执行:
另一种写法:
<?php //改成回调,让系统来调用 系统要通过一个代理函数来完成 //第一个参数为函数名,第二个参数为传递给函数的值 echo call_user_func(function($siteName){echo "欢迎来到".$siteName;},'www.xuexianswer.com');
执行:
如果实参多余形参,多余的实参会被忽略
<?php echo call_user_func(function($siteName,$course){echo "欢迎来到".$siteName."学习".$course;},'www.xuexianswer.com','php','java');
执行,第三个实参java被忽略
调用类中的方法做为回调
<?php //支持调用类中的方法做为回调 class Demo1 { //普通方法 public function sum($a,$b) { return $a+$b; } } //调用普通方法 $obj=new Demo1(); //[$obj,'sum']执行obj对象中的sum方法 echo call_user_func([$obj,'sum'],10,15);
执行:
如果PHP版本为php5.4+,new还可以简写:
<?php //支持调用类中的方法做为回调 class Demo1 { //普通方法 public function sum($a,$b) { return $a+$b; } } //[$obj,'sum']执行obj对象中的sum方法 echo call_user_func([(new Demo1()),'sum'],10,15);
执行:
2.call_user_func_array(callback, array)
只接受二个参数:回调,索引数组,传给回调的参数全部打包到索引数组中
与call_user_func(array,arg1…)不同之处仅仅传递参数方式不同
回调同样支持:字符串函数名,类名,数组,匿名函数
<?php echo call_user_func_array(function(){ $msg="前端开发的基础知识包括"; //func_get_args()获取函数中的所有参数 foreach (func_get_args() as $value) { $msg.=$value." "; } return $msg; },['html','css','javascript']);
执行:
用代理函数调用静态方法:
<?php class Demo1 { public static function multi($a,$b) { return $a*$b; } } //用代理函数调用静态方法有两种方式: //1.数组参数: echo call_user_func(['Demo1','multi'],5,6); echo "<hr>"; //2.字符串方式 echo call_user_func('Demo1::multi',10,6);
执行:
恫殊标构和邓匣蚊哎形劫跨溉