zoukankan      html  css  js  c++  java
  • [轉]PHP5中方法重载的实现研究

    From : http://www.uh80.com/?p=371

    方法1:用__call()方法

    今天遇到一个头疼的问题,如何在PHP中实现方法重载(包括构造器重载).查阅了很多资料,直接重载是无法实现的.但是可以通过__call()方法来变相实现.实际上这个方法我认为很差.是PHP开发者偷懒,才想出这么一个拐弯抹角的方法,而且用这个方法实现的重载程度非常有限,尤其是构造器重载,已经不是真正意义上的构造器。构造器在对象被创建时自动执行,一般不会显式的调用。而用__call()方法实现的构造器必须显示的调用,也就是说构造函数与普通函数的性质完全相同,只不过功能不同而已了。
    下面是我写出的一个实例代码:
    <?php
    class OverloadTest{
        public function __call($name,$para){
     if($name==’construct’){
      switch (count($para)){
       case 0:
        $this->cons1();
        break;
       case 1:
        $this->cons2($para[0]);
        break;
       default:
        print ”wrong para”;
      }
     }else{
     print ’Undefined method ’.$name;
     } 
        }
        function cons1(){
       echo ”cons1() called”;
        }
        function cons2($var){
       echo ”cons2() called.”;
        }
    }
    $foo = new OverloadTest();
    $foo->construct();
    $foo->construct(‘test’);
    ?>

    定义了类OverloadTest,目的是使该类有两个构造器,一个是无参数的,一个是有一个参数的(普通method的重载与这个道理完全相同)。由于无法直接定义两个__construct()构造器,因此只好定义cons1()和cons2($var)两个普通方法,然后定义__call()方法,在__call()方法中判断调用的来源,如果是调用construct()函数,则根据参数的个数情况分别转到不同的方法去执行。如参数个数为0时,转到cons1(),参数个数为1时,转到cons2()。还可以继续增加所支持的参数的个数,只需要在switch—case 语句中增加即可。另外如果有足够的精力,还可以通过使用is_int()等函数来判断参数的类型,进而可以根据不同的参数类型调用不同的方法。
    细节代码不再赘述,有问题的可以到群中讨论。
    ——————————————-
    方法2:用func_get_args()和func_num_args()函数

    func_get_args()和func_num_args()函数以前没大用过。今天受phpdream朋友的启发,研究了一下这两个函数的功能,发现可以很好的解决方法重载的参数传递问题。尤其是采用这种方法后,构造器的问题得到了较好的解决,可以不必显式的调用构造器,这一点非常不错。普通的方法重载,也可以用这个方法很好的实现。
    一个完整的实例如下:(以构造器重载为例)
    <?php
    class OverloadTest{
       function __construct(){
     $arr=func_get_args();
     switch(func_num_args()){
      case 1:
      $this->cons1($arr[0]);
      break;
      case 2:
      $this->cons2($arr[0],$arr[1]);
      break;
      }
       }
        function cons1($var){
       echo ”cons1(“.$var.”) called.”;
        }
        function cons2($var1,$var2){
       echo ”cons2(“.$var1.”,”.$var2.”) called.”;
        }
    }
    $foo = new OverloadTest(‘x’);
    $foo2 = new OverloadTest(‘x’,”y”);

    ?>
    根据我的实验,这种情况下有可能出现PHP警告,原因是参数个数不匹配,但是我在PHP5+APACHE2下测试,打开所有的error_reporting,仍然没有任何警告信息。但是为了保险起见,我建议在调用重载的方法前在语句前加“@”,来防止出现警告信息。如本例中,可以这样:
    @$foo = new OverloadTest(‘x’);
    @$foo2 = new OverloadTest(‘x’,”y”);
    如果是调用普通方法
    @$var=method1();
    @$var2=method1(‘xyz’);

    根据自己的需要可以对代码进行修改,以满足不同参数个数的需要。
    个人认为后一种方法还是比较不错的。

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    nyoj 69 数的长度
    hdu 1437 天气情况【概率DP】
    hdu 2058 The sum problem
    hdu 1491 Octorber 21st
    Aras学习笔记(16)- Aras官方项目Tree Grid View Sample原理介绍
    Aras学习笔记 (15)
    Aras学习笔记 (14) DotNet操作Aras常用代码代码汇总(陆续更新中)
    Aras学习笔记 (13) Javascript端常用代码代码汇总(陆续更新中)
    Aras学习笔记 (12) C#代码读取域用户列表(转,翻译)
    Aras学习笔记 (11) Aras集成AD账号
  • 原文地址:https://www.cnblogs.com/Athrun/p/1729385.html
Copyright © 2011-2022 走看看