您的位置:首页 > 编程语言 > PHP开发

PHP面向对象之重写与重载

2015-12-16 13:06 676 查看
<?php  

/***  

====笔记部分====  

重写/覆盖  override  

指:子类重写了父类的同名方法  

重载: overload  

重载是指:存在多个同名方法,但参数类型/个数不同.  

传不同的参数,调用不同的方法  

但是在PHP中,不允许存在多个同名方法.  

因此,不能够完成java,c++中的这种重载  

但是,PHP的灵活,能达到类似的效果  

***/   

/****  

代码部分  

****/   

  

class human{  

  public function say($name){  

   echo $name,' 吃了吗?<br />';  

  }  

}  

  

class stu extends human{  

  

  public function say(){  

   echo '切克闹,卡猫百比<br />';  

  }  

  /* 

  public function say($a,$b,$c){ 

   echo '哥仨好'; 

  } 

  报错: 

  Fatal error: Cannot redeclare stu::say() in D:\wamp\www\php\61.php on line 28 

  在PHP中,不允许存在多个同名方法,没有重载概念这一说。 

  */  

}  

  

$li=new stu();  

$li->say();  

$li->say('binghui');// 上面这个过程叫重写override!   

/* 

结果: 

切克闹,卡猫百比 

切克闹,卡猫百比 

*/  

  

  

//在PHP中模拟重载的方法  

class Calc {   

    public function area() {   

        // 判断一个调用area时,得到的参数个数   

        $args = func_get_args();   

        if(count($args) == 1) {   

            return 3.14 * $args[0] * $args[0];   

        } else if(count($args) == 2) {   

            return $args[0] * $args[1];   

        } else {   

            return '未知图形';   

        }   

    }   

}   

$calc = new Calc();   

// 计算圆的页面   

echo $calc->area(10),'<br />';   

// 计算矩形的面积   

echo $calc->area(5,8);  

?> 

PHP函数重载

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

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

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

2、参数的类型不一样。

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

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

1、默认参数

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

[php] view
plaincopy

function overloadFun($param1, $param2 = '1',$param3 = true)  

{  

    // do something   

}  

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

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

[php] view
plaincopy

function overloadFun()  

{  

    // overloadFun可以随便定义,但为了命名规范,建议宝贝为与此函数名一样,  

    // 后面的尾随数值为参数个数,以方便管理  

$name="overloadFun".func_num_args();   

  return call_user_func_array(array($this,$name), func_get_args());       

}  

  

function overloadFun0()  

{  

    // do something  

}  

  

function overloadFun1()  

{  

    // do something  

}  

  

function overloadFun2()  

{  

    // do something  

}   

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

[php] view
plaincopy

function __call($name, $args)  

{  

    if($name=='overloadFun')  

    {  

        switch(count($args))  

        {  

            case 0: $this->overloadFun0();break;  

            case 1: $this->overloadFun1($args[0]); break;  

            case 2: $this->overloadFun2($args[0], $args[1]); break;  

            default: //do something  

              break;  

        }  

    }  

}  

  

function overloadFun0()  

{  

    // do something  

}  

  

function overloadFun1()  

{  

    // do something  

}  

  

function overloadFun2()  

{  

    // do something  

}    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: