免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1618 | 回复: 1

php函数call_user_func和call_user_func_array详解 [复制链接]

论坛徽章:
0
发表于 2012-01-09 20:33 |显示全部楼层

php函数call_user_func和call_user_func_array详解








call_user_func函数类似于一种特别的调用函数的方法,使用方法如下:
  1. function a($b,$c)
  2. {
  3. echo $b;
  4. echo $c;
  5. }
  6. call_user_func('a', "111","222");
  7. call_user_func('a', "333","444");
  8. //显示 111 222 333 444
  9. ?>
复制代码
调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也是满有新意的:
  1. class a {
  2. function b($c)
  3. {
  4. echo $c;
  5. }
  6. }
  7. call_user_func(array("a", "b"),"111");
  8. //显示 111
  9. ?>
复制代码
call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:
  1. function a($b, $c)
  2. {
  3. echo $b;
  4. echo $c;

  5. }
  6. call_user_func_array('a', array("111", "222"));
  7. //显示 111 222
  8. ?>

  9. call_user_func_array函数也可以调用类内部的方法的

  10. Class ClassA
  11. {

  12. function bc($b, $c) {
  13.      $bc = $b + $c;
  14. echo $bc;
  15. }
  16. }
  17. call_user_func_array(array('ClassA','bc'), array("111", "222"));

  18. //显示 333
  19. ?>

  20. call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致:
  21. function a(&$b)
  22. {
  23. $b++;
  24. }
  25. $c = 0;
  26. call_user_func('a', &$c);
  27. echo $c;//显示 1
  28. call_user_func_array('a', array(&$c));
  29. echo $c;//显示 2
复制代码
php之call_user_func_array的简易用法

今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的:
  1. call_user_func_array


  2. (PHP 4 >= 4.0.4, PHP 5)
  3. call_user_func_array -- Call a user function given with an array of parameters

  4. Description
  5. mixed call_user_func_array ( callback function, array param_arr )


  6. Call a user defined function given by function, with the parameters in param_arr.
复制代码
然后还有一个例子:





相信看了例子之后应该有点明白了吧?
我自己是这么理解这个函数的,如果说的不对,还望各位高手不要耻笑:
     该函数真正的用法有点类似于函数重载,因为他的第一个参数是字符型的,也就是函数的名称,第二个参数是数组,我们可以当成该函数的各个参数,而事实上也就是这么用的,如果你看过我的前一篇文章:PHP的伪重载 ,或许你能够理解,正是因为这个函数的存在,我发现函数重载也可以这样运用:





Php代码
  1. 1.function otest1 ($a)  
  2. 2. {  
  3. 3.    echo( '一个参数' );  
  4. 4.}  
  5. 5.  
  6. 6.function otest2 ( $a, $b)  
  7. 7.{  
  8. 8.     echo( '二个参数' );  
  9. 9.  }  
  10. 10.  
  11. 11.  function otest3 ( $a ,$b,$c)  
  12. 12.  {  
  13. 13.      echo( '三个啦' );  
  14. 14.  }  
  15. 15.  
  16. 16. function otest ()  
  17. 17.  {  
  18. 18.     $args = func_get_args();  
  19. 19.     $num = func_num_args();  
  20. 20.      call_user_func_array( 'otest'.$num, $args   );  
  21. 21.   }  
  22. 22.  
  23. 23.  otest(1,2);  
复制代码

论坛徽章:
0
发表于 2012-01-09 20:33 |显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP