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不能访问父类中的属性(静态属性和常量可以)