php中func_get_arg,func_get_args,func_num_args实现伪重载

我们知道在PHP中没有函数重载这个概念,让很多时候我们无法进行一些处理,甚至有时候不得不在函数后面定义好N个参数只有使用func_get_arg,func_get_args,func_num_args实现伪重载了,下面一起来看看吧.

偶尔在网上看到关于php的伪重载的问题,有点兴趣便研究了一下,下面作者将说说php如何利用func_get_arg,func_get_args,func_num_args实现函数的伪重载问题.

首先说说方法重载的好处:

实现方法重载可以不用为了对不同的参数类型或参数个数,而写多个函数,多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数,如果我们使用reflector去查看微软写的.net的基类库的话,我们可以发现他使用很多的方法重载,这样我们在调用的时候,就不需要记那么多的方法名称,而是知道了方法的功能就可以直接的给他传递不同的参数,编译器会明确的知道我们调用了哪一个方法.

但是在PHP中没有函数重载这个概念,让很多时候我们无法进行一些处理,甚至有时候不得不在函数后面定义好N个参数来解决相关问题,而php提供了几个函数,比如:func_get_arg,func_get_args,func_num_args 却可以直接解决相关问题,具体举个示例代码如下:

  1. <?php
  2. function testOne($a) {
  3. echo ('一个参数就这样 ');
  4. }
  5. function testTwo($a, $b) {
  6. echo ('两个参数的就这样 ');
  7. }
  8. function testThree($a, $b, $c) {
  9. echo ('呵呵,这是三个参数的 ');
  10. } //开源软件:phpfensi.com
  11. function test() {
  12. $argNum = func_num_args();
  13. // 这一段其实可以用 $_arg = func_get_args() 来获得所有的参数,只是要用数组而已,不方便我下面的表达,呵呵
  14. for ($i = 0; $i < $argNum; $i++) {
  15. $_arg_{$i} = func_get_arg($i);
  16. }
  17. switch ($argNum) {
  18. case 1 :
  19. testOne($_arg_1);
  20. break ;
  21. case 2 :
  22. testTwo($_arg_1, $_arg_2);
  23. break ;
  24. case 3 :
  25. testThree($_arg_1, $_arg_2, $_arg_3);
  26. break ;
  27. default :
  28. echo (' 这是没有参数的情况 ');
  29. break ;
  30. }
  31. }
  32. /**
  33. * 例子的实现
  34. */
  35. test();
  36. echo ('<br>');
  37. test(1);
  38. echo ('<br>');
  39. test(1, 2);
  40. echo ('<br>');
  41. test(1, 2, 3);
  42. // 这些只是在函数中的运用,其实最主要的还是在类中的运用
  43. // 如果这些用到类里面我就不需要担心构造函数是否有几个参数了,不是吗?
  44. // 类里面的运用只举一个简单的例子
  45. class test{
  46. var $a = 0;
  47. var $b = 0;
  48. function test() {
  49. $argNum = func_num_args();
  50. $_arg = func_get_args();
  51. switch ($argNum) {
  52. case 1 :
  53. $this->test1($_arg[0]);
  54. break ;
  55. case 2 :
  56. $this->test2($_arg[0], $_arg[1]);
  57. break;
  58. default :
  59. $this->a = 0;
  60. $this->b = 1;
  61. break;
  62. }
  63. }
  64. function test1($a) {
  65. $this->a = $a;
  66. }
  67. function test2($a, $b) {
  68. $this->a = $a;
  69. $this->b = $b ;
  70. }
  71. }
  72. ?>

友情提示:

php的的func_num_args、func_get_arg和func_get_args都是返回函数实参相关的函数.

func_num_args:实参个数;

func_get_arg:返回某一个实参,必须事实参数组的索引;

func_get_args:返回实参数组;