首页 > 语言 > PHP > 正文

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

2024-09-04 11:49:14
字体:大 中 小
来源:转载
供稿:网友

我们知道在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. }  //开源软件:Vevb.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:返回实参数组;

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表