请选择 进入手机版 | 继续访问电脑版
绿茶科技社区
call_user_func:把一个参数作为回调函数调用
用法说明:
  1. call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed
复制代码
参数说明:
第一个参数$callback作为回调函数,其它参数都是回调函数的参数。
$parameter:传入回调$callback函数的参数,这里的参数注意不能引用传递。
下面简单例子分别说明了在不同情况下使用call_user_func:
  1. //先引用,后执行
  2. function _call($call){
  3.     echo $call++.'<br/>';
  4.     echo $call++.'<br/>';
  5.     return $call;
  6. }
  7. $rs = call_user_func('_call',1);
  8. var_dump($rs);

  9. //结果
  10. //1
  11. //2
  12. //int(3)
复制代码
先执行,后引用
  1. $arg = 1;
  2. call_user_func(function ($call){
  3.     echo ++$call.'<br/>';
  4.     echo ++$call.'<br/>';
  5. },$arg);

  6. //结果为2,3
复制代码
回调函数不传值,通过func_get_arg和func_get_args获取参数
  1. $argOne = 1;
  2. $argTwo = 2;
  3. call_user_func(function (){
  4.     //获取第几个参数
  5.     $arg = func_get_arg(0);
  6.     var_dump($arg);
  7.     echo '<br/>';
  8.     //获取所有的参数,并以数组的形式返回
  9.     $args = func_get_args();
  10.     var_dump($args);
  11.     //获取参数个数
  12.     $argNum = func_num_args();
  13.     echo "<br/>";
  14.     var_dump($argNum);
  15. },$argOne,$argTwo);

  16. //结果为
  17. int(1)
  18. array(2) { [0]=> int(1) [1]=> int(2) }
  19. int(2)
复制代码
调用类方法:
调用类中的静态方法有两种形式,而调用public方法第一个参数只能为数组
  1. class Func{

  2.     static public function _One(){
  3.         $str = "THE CLASS NAME IS".__CLASS__." AND CLASS STATIC METHOD IS ".__METHOD__;
  4.         $argNum = func_num_args();
  5.         if($argNum){
  6.             $arg = func_get_arg(0);
  7.             return $str.' and argument is '.$arg;
  8.         }else{
  9.             return $str;
  10.         }
  11.     }


  12.     public function _Two($num){
  13.         return $num ? $num + 1 : $num;
  14.     }

  15. }

  16. echo "<br/>";
  17. //调用类的静态方法
  18. var_dump(call_user_func('Func::_One','one'));
  19. echo '<br/>';
  20. var_dump(call_user_func(['Func','_One']));

  21. $num = 4;
  22. $o = new Func;
  23. //调用类普通方法
  24. $return = call_user_func(array($o,'_Two'),$num);
  25. echo '<br/>';
  26. var_dump($return);

  27. 结果:
  28. string(79) "THE CLASS NAME ISFunc AND CLASS STATIC METHOD IS Func::_One and argument is one"
  29. string(59) "THE CLASS NAME ISFunc AND CLASS STATIC METHOD IS Func::_One"
  30. int(5)
复制代码
调用有命名空间的类时call_user_func的用法与上面的同理
  1. //调用静态方法
  2. call_user_func(array(__NAMESPACE__.'\StaticDemo','_One'),100);
  3. call_user_func('App\StaticDemo::_One',200);
  4. //调用public方法
  5. 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的参数二只能为数组。

分享到 :
0 人收藏

3 个回复

倒序浏览
一是二  高级会员 | 2019-10-31 06:37:29
我擦!我要沙发!
老翅寒暑  金牌会员 | 2019-11-18 11:55:42
佩服佩服!
阿新  金牌会员 | 2019-11-30 02:48:52
前排顶,很好!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

举报|Archiver|手机版|小黑屋|Lvchakeji Inc.  

Powered by Discuz! X3.3 © 2001-2016 Comsenz Inc.

返回顶部