zoukankan      html  css  js  c++  java
  • php--重写override

    思考:子列可以从父类进行继承,那如果子类与父类的成员重名了怎么办?

    引入:首先,类中定义的成员是允许出现与其他类同名的,但是这个过程如果出现了继承,那么重名就存在重写的问题。

    重写override【掌握】

    定义:重写,即子类中定义了与父类重名的成员,子类可以重写父类任意类成员,通常重写是用来重写父类的方法;用于扩展或者更改某些业务逻辑。

    1.子类继承父类,同时子类定义与父类同名的类成员。,重写父类成员之后,子类只会直接访问子类的成员(覆盖)

    <?php
    
    class posen{
       public $name="posen";
       public function show(){
          echo __CLASS__.$this->name;
       }
    }
    
    class man extends posen{
       //我们在定义跟父类一样的成员就可以实现重写
       public $name="man";            //重写成员
       public function show(){        //重写方法
          echo __CLASS__.$this->name;
       }
    }
    
    
    $s=new man();
    echo $s->name;   //输出 man
    echo '<hr>'; 
    $s->show();     //输出 man  man  都是子类中的方法和属性
    
    
    ?>

    注意:不管是共有和受保护属性,一旦重写,父类的就会不存在,二私有属性不会被覆盖而丢失

    <?php
    
    class posen{
       private $count=100;   //此成员不会被子类重写而丢失
       public $name="posen";
       public function show(){
          echo __CLASS__.$this->name;
       }
    }
    
    class man extends posen{          //重写后将会有2个$count 1个name  1个show  而继承过来的name和show将会覆盖掉而私有不会覆盖
       //我们在定义跟父类一样的成员就可以实现重写
       public $name="man";            //重写成员
       private $count=1;
       public function show(){        //重写方法
          echo __CLASS__.$this->name;
       }
    }
    
    $s=new man();
    echo $s->name;   //输出 man
    echo '<hr>'; 
    $s->show();     //输出 man  man  都是子类中的方法和属性
    
    ?>

    3.重写的要求,子类重写父类的方法,控制权不能高于父类,即子类可以比父类更开放。

    <?php
    
    class posen{
       private $count=100;   
       public $name="posen";
       public function show(){
          echo __CLASS__.$this->name;
       }
    }
    
    class man extends posen{          
     
       private $name="man";          
       private $count=1;
       public function show(){       
          echo __CLASS__.$this->name;
       }
    }
    
       $s=new man();
       $s->show();   //报错  Access level to man::$name must be public (as in class posen) 控制权不能高于父类
       // 父类是公开的,而你重写后 变成私有  高于了父类的控制权
    
    ?>

    4.重写要求2:php重写要求子类重写父类方法的时候,必须保证与父类同名方法参数一致

    <?php
    
    class posen{
       private $count=100;   
       public $name="posen";
       public function show($a){
          echo __CLASS__.$this->name;
       }
    }
    
    class man extends posen{          
     
       public $name="man";          
       private $count=1;
       public function show(){       
          echo __CLASS__.$this->name;
       }
    }
    
       $s=new man();
       $s->show();   //错误,与父类同名方法参数不一致
    
    ?>

    注意:在方法参数一致不单单是数量一致,而且数据类型要求也必须相同,但形参名可以不同,另外,在php7以前重写对于参数这块没有要求

    5.重写要求3:重写针对的是被继承的成员,父类私有方法不会被继承,因此不受要求2规定。

    因为都不会被继承了,所以不受要求,如果子类中创建了一样的和父类中的方法名,而父类为私有(不被继承),也不会报错。

    6.重写是指子类拥有特殊的情况,一般是需要在父类的基础上进行扩展,此时如果想要继续保证父类被重写的方法继续执行(默认

    永远只能方法子类重写的方法),需要在子类重写方法的时候使用parent关键字。

    <?php
    
    class posen{
       private $count=100;   
       public $name="posen";
       public function show(){
          echo __CLASS__.$this->name;
       }
    }
    
    class man extends posen{          
     
       public $name="man";          
       private $count=1;
       public function show(){       
          echo __CLASS__.$this->name;
          echo '<hr>';
          // 强制调用父类被重写的方法
          parent::show();
       }
    
    }
    
       $s=new man();
       $s->show();   //错误,与父类同名方法参数不一致
    
    ?>

    注意:parent不能访问父类属性,可以访问静态属性,静态方法类常量和普通方法。

    总结: 

    1.重写override是一种在子类中i当以父类同名成员的操作

    2.公有。受保护属性重写是直接覆盖父类成员,私有属性不会被覆盖,公有,受保护的方法会被重写,但是私有方法不会被重写,因此私有方法不会被继承

    3.重写的要求

        1.子类控制权不能高于父类控制权

        2.php7中要求被重写的方法必须与父类保持参数一致(数量和类型也一样)

        3.方法被重写后,访问调用的都是子类方法,如果想要访问父类方法,可以通过子类方法中使用parent关键字来强制访问父类方法

        4.parent不能访问父类中的属性(静态属性和常量可以)

  • 相关阅读:
    /tmp/orbit-oracle/目录inode耗尽
    sp_change_users_login 'Update_One', '用户名', '登录名';
    自动载入Python虚拟环境
    Windows下安装MySQL详细教程
    python版本下载时时,官方目录web-based与executable和embeddable 的区别
    print,printf,println
    大文件文本数据处理
    通过文件指针插入文件内容
    sizeof和strlen的使用
    java八大基本数据类型
  • 原文地址:https://www.cnblogs.com/xiaowie/p/12290581.html
Copyright © 2011-2022 走看看