PHP面向对象编程之--多态:方法重载与重写

重载

基本概念: 函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名,

但是可以区分不同的函数

PHP5 中可以通过魔术函数来实现方法重载的效果。

代码说明:

<?php
class  A{
    public function test1($p){
        echo "接收一个参数<br/>";
        echo "接收到参数是:<br/>";
        echo var_dump($p);
    }
    public function test2($p){
        echo "<br/><br/>接收两个参数<br/>";
        echo "接收到参数是:<br/>";
        var_dump($p);
    }
              
    //这些提供一个__call
    //__call: 是当一个对象调用某个方法,而该方法不存在,则
    //系统会自动调用__call
    function __call($method,$p){
        if($method=="test"){
            if(count($p)==1){
                $this->test1($p);
            }else if(count($p)==2){
                $this->test2($p);
            }
        }
    }
}
       $a=new A();
       $a->test("小明");
       $a->test("小民","男");
?>
小结: 关于重载
①     php5 默认情况下不直接支持方法重载

②     php5 可以通过  __call  魔术方法,模拟一个方法重载的效果.


方法的重写/方法的覆盖(override)
当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法究竟如何写,

可以让子类去覆盖这个方法,具体用法如下:

<?php
 //抽象一个Animal类
       class Animal{
              public $name;
              protected $price;
              function cry(){
                     echo "不知道动物怎么叫..";
                     echo "<br/>";
              }
       }
       class Dog extends Animal{
              //覆盖父类中的 cry()方法
                function cry(){
                     echo "小狗汪汪叫..";
                     echo "<br>";
              }
       }
       class Pig extends Animal{
              //覆盖<span style="font-family: Arial, Helvetica, sans-serif;">父类中的 cry()方法</span>
              function cry(){
                     echo "小猪哼哼叫..";
                     echo "<br>";
              }
       }
       //创建一个只狗
       $animal=new Animal();
       $animal->cry();
       $dog1=new Dog();
       $dog1->cry();
       $pig1=new Pig();
       $pig1->cry();
?>
关于方法重写细节讨论:
方法重写就是子类有一个方法,和父类的某个方法的名称、参数个数一样,那么我们就说子类的这个方法重写了父类的那个方法。
1. 要实现重写,要求 子类的那个方法的名字和参数个数一摸一样,但是并不要求参数的名称一样.
2. 如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法名(参数..) , 父类名::方法名(参数...)
3. 在实现方法覆盖的时候,访问修饰符可以不一样       //但是必须满足: 子类的访问范围>=父类的访问范围
注意:当父类的函数为私有(private)类型时,不能覆盖,因为父类为私有该函数根本不能继承。
// 多态体现在什么地方?
// class Animal{
//               public function cry(){
//                      echo '动物叫唤..';
//               }
//        }
//        class Cat extends Animal{
//               public  function cry(){
//                      echo "abc";
//               }
//        }
//        $cat1=new Cat();
//        $cat1->cry();
// 当子类没有覆盖父类的方法则 $cat1->cry() 调用的是父类,当 子类覆盖了父类的方法,则调用自己的cry() 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值