PHP面向对象之重写与重载

来源:互联网 发布:单片机原理经典教材 编辑:程序博客网 时间:2024/03/29 06:25
  1. <?php  
  2. /***  
  3. ====笔记部分====  
  4. 重写/覆盖  override  
  5. 指:子类重写了父类的同名方法  
  6. 重载: overload  
  7. 重载是指:存在多个同名方法,但参数类型/个数不同.  
  8. 传不同的参数,调用不同的方法  
  9. 但是在PHP中,不允许存在多个同名方法.  
  10. 因此,不能够完成java,c++中的这种重载  
  11. 但是,PHP的灵活,能达到类似的效果  
  12. ***/   
  13. /****  
  14. 代码部分  
  15. ****/   
  16.   
  17. class human{  
  18.   public function say($name){  
  19.    echo $name,' 吃了吗?<br />';  
  20.   }  
  21. }  
  22.   
  23. class stu extends human{  
  24.   
  25.   public function say(){  
  26.    echo '切克闹,卡猫百比<br />';  
  27.   }  
  28.   /* 
  29.   public function say($a,$b,$c){ 
  30.    echo '哥仨好'; 
  31.   } 
  32.   报错: 
  33.   Fatal error: Cannot redeclare stu::say() in D:\wamp\www\php\61.php on line 28 
  34.   在PHP中,不允许存在多个同名方法,没有重载概念这一说。 
  35.   */  
  36. }  
  37.   
  38. $li=new stu();  
  39. $li->say();  
  40. $li->say('binghui');// 上面这个过程叫重写override!   
  41. /* 
  42. 结果: 
  43. 切克闹,卡猫百比 
  44. 切克闹,卡猫百比 
  45. */  
  46.   
  47.   
  48. //在PHP中模拟重载的方法  
  49. class Calc {   
  50.     public function area() {   
  51.         // 判断一个调用area时,得到的参数个数   
  52.         $args = func_get_args();   
  53.         if(count($args) == 1) {   
  54.             return 3.14 * $args[0] * $args[0];   
  55.         } else if(count($args) == 2) {   
  56.             return $args[0] * $args[1];   
  57.         } else {   
  58.             return '未知图形';   
  59.         }   
  60.     }   
  61. }   
  62. $calc = new Calc();   
  63. // 计算圆的页面   
  64. echo $calc->area(10),'<br />';   
  65. // 计算矩形的面积   
  66. echo $calc->area(5,8);  
  67. ?> 


PHP函数重载
  1. 对于弱类型语言来说,PHP函数重载,并不像一般的OOP那样。

    因为函数重载必须满足两个条件:

    1、函数参数的个数不一样。

    2、参数的类型不一样。

    这两点,PHP都没有办法满足,您可以对函数多添加参数,只是相当于多传了个临时变量。而弱类型本来就不区分,所以无法通过这些来实现。

    但是,可以通过下面的方法来实现简单的伪重载吧。

    1、默认参数

    从这个上面就可以看到,如果一个函数里面,我对不是必须参数填写添加相应的默认值,就可以完成相应的功能。

    [php] view plaincopy
    1. function overloadFun($param1$param2 = '1',$param3 = true)  
    2. {  
    3.     // do something   
    4. }  

    2、利用函数func_get_args()和call_user_func_array(),详细的帮助参照PHP手册。

    利用一个有规则的函数进行调用,以方便统一管理。

    [php] view plaincopy
    1. function overloadFun()  
    2. {  
    3.     // overloadFun可以随便定义,但为了命名规范,建议宝贝为与此函数名一样,  
    4.     // 后面的尾随数值为参数个数,以方便管理  
    5. $name="overloadFun".func_num_args();   
    6.   return call_user_func_array(array($this,$name), func_get_args());       
    7. }  
    8.   
    9. function overloadFun0()  
    10. {  
    11.     // do something  
    12. }  
    13.   
    14. function overloadFun1()  
    15. {  
    16.     // do something  
    17. }  
    18.   
    19. function overloadFun2()  
    20. {  
    21.     // do something  
    22. }   

    3、利用__call($name, $arg)魔术方法 函数进行处理。

    [php] view plaincopy
    1. function __call($name$args)  
    2. {  
    3.     if($name=='overloadFun')  
    4.     {  
    5.         switch(count($args))  
    6.         {  
    7.             case 0: $this->overloadFun0();break;  
    8.             case 1: $this->overloadFun1($args[0]); break;  
    9.             case 2: $this->overloadFun2($args[0], $args[1]); break;  
    10.             default//do something  
    11.               break;  
    12.         }  
    13.     }  
    14. }  
    15.   
    16. function overloadFun0()  
    17. {  
    18.     // do something  
    19. }  
    20.   
    21. function overloadFun1()  
    22. {  
    23.     // do something  
    24. }  
    25.   
    26. function overloadFun2()  
    27. {  
    28.     // do something  
    29. }    



0 0