PHP中的call_user_func()与call_user_func_array()简单理解
call_user_func:把一个参数作为回调函数调用
用法说明:
1 | call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed |
参数说明:
第一个参数$callback作为回调函数,其它参数都是回调函数的参数。
$parameter:传入回调$callback函数的参数,这里的参数注意不能引用传递。
下面简单例子分别说明了在不同情况下使用call_user_func:
1 2 3 4 5 6 7 8 9 10 11 12 13 | //先引用,后执行 function _call( $call ){ echo $call ++. '<br/>' ; echo $call ++. '<br/>' ; return $call ; } $rs = call_user_func( '_call' ,1); var_dump( $rs ); //结果 //1 //2 //int(3) |
先执行,后引用
1 2 3 4 5 6 7 | $arg = 1; call_user_func( function ( $call ){ echo ++ $call . '<br/>' ; echo ++ $call . '<br/>' ; }, $arg ); //结果为2,3 |
回调函数不传值,通过func_get_arg和func_get_args获取参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $argOne = 1; $argTwo = 2; call_user_func( function (){ //获取第几个参数 $arg = func_get_arg(0); var_dump( $arg ); echo '<br/>' ; //获取所有的参数,并以数组的形式返回 $args = func_get_args(); var_dump( $args ); //获取参数个数 $argNum = func_num_args(); echo "<br/>" ; var_dump( $argNum ); }, $argOne , $argTwo ); //结果为 int(1) array (2) { [0]=> int(1) [1]=> int(2) } int(2) |
调用类方法:
调用类中的静态方法有两种形式,而调用public方法第一个参数只能为数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class Func{ static public function _One(){ $str = "THE CLASS NAME IS" . __CLASS__ . " AND CLASS STATIC METHOD IS " . __METHOD__ ; $argNum = func_num_args(); if ( $argNum ){ $arg = func_get_arg(0); return $str . ' and argument is ' . $arg ; } else { return $str ; } } public function _Two( $num ){ return $num ? $num + 1 : $num ; } } echo "<br/>" ; //调用类的静态方法 var_dump(call_user_func( 'Func::_One' , 'one' )); echo '<br/>' ; var_dump(call_user_func([ 'Func' , '_One' ])); $num = 4; $o = new Func; //调用类普通方法 $return = call_user_func( array ( $o , '_Two' ), $num ); echo '<br/>' ; var_dump( $return ); 结果: string(79) "THE CLASS NAME ISFunc AND CLASS STATIC METHOD IS Func::_One and argument is one" string(59) "THE CLASS NAME ISFunc AND CLASS STATIC METHOD IS Func::_One" int(5) |
调用有命名空间的类时call_user_func的用法与上面的同理
1 2 3 4 5 | //调用静态方法 call_user_func( array (__NAMESPACE__. '\StaticDemo' , '_One' ),100); call_user_func( 'App\StaticDemo::_One' ,200); //调用public方法 call_user_func( array ( $obj , '_Two' ),2,3,4); |
最后:
和call_user_func函数类似的还有call_user_func_array,call_user_func_array的作用和call_user_func的作用一样,
不同的是call_user_func用回调函数处理字符,而call_user_func_array用回调处理数组,也就是说call_user_func_array的参数二只能为数组。
分类:
后台技术
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端