您好,欢迎访问一九零五行业门户网

如果还有一次机会,重写override便是你的出路

定义:重写(override),即子类中定义了与父类重名的成员,子类可以重写父类任意类成员,通常重写是用来重写父类的方法,用于扩展或者更改某些业务逻辑。
  1.不管是公有属性,还是受保护属性,一旦重写,父类的属性就会不存在,而私有属性不会因为被覆盖而丢失。
<?php class a{ public $name='张三'; protected $sex='man'; private $age='25'; public function getname(){ echo __class__,'<br/>'; echo $this->name."<br>"; } protected function getsex(){ echo __class__,'<br/>'; echo $this->sex."<br>"; } private function getage(){ echo __class__,'<br/>'; echo $this->age."<br>"; } } class b extends a{ public $name='王五'; protected $sex='woman'; private $age='26'; public function getall(){ echo $this->name."<br>"; echo $this->sex."<br>"; echo $this->age."<br>"; } } $a=new b(); var_dump($a); /* object(b)#1 (4) { ["name"]=> string(6) "王五" ["sex":protected]=> string(5) "woman" ["age":"b":private]=> string(2) "26" ["age":"a":private]=> string(2) "25" }*/ echo "<br>"; $a->getall();//王五 woman 26?>
可以发现无论是公有属性,还是受保护属性都被覆盖,而私有属性因为没有被继承,所以不受影响。
<?php class a{ public $name='张三'; protected $sex='man'; private $age='25'; public function getname(){ echo $this->name."我是父类的getname"."<br>"; } protected function getsex(){ echo $this->sex."我是父类的getsex"."<br>"; } private function getage(){ echo $this->age."我是父类的getage"."<br>"; } } class b extends a{ public $name='王五'; protected $sex='woman'; private $age='26'; public function getname(){ echo $this->name."我是子类的getname"."<br>"; } protected function getsex(){ echo $this->sex."我是子类的getsex"."<br>"; } private function getage(){ echo $this->age."我是子类的getage"."<br>"; } public function getall(){ $this->getname(); $this->getsex(); $this->getage(); } } $a=new b(); $a->getall();//王五我是子类的getname woman我是子类的getsex 26我是子类的getage echo "<br>";?>
小结:公有、受保护的属性重写是直接覆盖父类成员,私有属性不会被覆盖;公有、收保护的方法会被重写,但是私有方法不会被重写(私有方法本质没有被继承)。
2.子类重写父类方法的要求。
a. 子类重写父类的方法,控制权不能高于父类,即子类可以比父类更开放。
<?phpclass fu{ protected function show(){ echo __class__,'<br/>'; }}class zi extends fu{ protected function show(){} //正确 public function show(){} //允许 private function show(){} //错误:控制权比父类更严格}?>
b. php中重写要求子类重写父类方法的时候,必须保证与父类同名方法参数一致。
<?phpclass fu{ protected function show(){ echo __class__,'<br/>'; }}class zi extends fu{ public function show(){} public function show($a){} //错误,与父类同名方法不一致}?>
c. 重写针对的是被继承的成员,父类私有方法不会被继承,因此不受要求b规定。
<?phpclass fu{ private function show(){ echo __class__,'<br/>'; }}class zi extends fu{ private function show($name){ //不会报错,因为本质不存在重写(父类fu::show没有被继承) echo $name,'<br/>'; }}?>
d.重写是指子类拥有特殊的情况,一般是需要在父类的基础上进行扩展,此时如果想要继续保证父类被重写的方法继续执行(默认永远只访问子类重写的新方法),需要在子类重写方法的时候使用parent关键字。
<?phpclass fu{ protected function show(){ echo __class__,'<br/>'; }}class zi extends fu{ public function show(){ parent::show(); //扩展业务逻辑 echo __class__,'<br/>'; }}?>
小结:parent不能访问父类的属性,可以访问静态属性、静态方法、类常量和普通方法。
推荐:php教程,php视频教程
以上就是如果还有一次机会,重写override便是你的出路的详细内容。
其它类似信息

推荐信息