定義:重寫(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. 子類別重寫父類別的方法,控制權不能高於父類,即子類別可以比父類別更開放。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ protected function show(){} //正确 public function show(){} //允许 private function show(){} //错误:控制权比父类更严格 } ?>
b. PHP中重寫要求子類別重寫父類別方法的時候,必須確保與父類別同名方法參數一致。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ public function show(){} public function show($a){} //错误,与父类同名方法不一致 } ?>
c. 重寫針對的是繼承的成員,父類別私有方法不會被繼承,因此不受要求b規定。
<?php class Fu{ private function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ private function show($name){ //不会报错,因为本质不存在重写(父类Fu::show没有被继承) echo $name,'<br/>'; } } ?>
d.重寫是指子類別擁有特殊的情況,一般是需要在父類別的基礎上進行擴展,此時如果想要繼續保證父類別被重寫的方法繼續執行(預設永遠只存取子類別重寫的新方法),需要在子類別重寫方法的時候使用parent
關鍵字。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ public function show(){ parent::show(); //扩展业务逻辑 echo __CLASS__,'<br/>'; } }?>
小結:parent
無法存取父類別的屬性,可以存取靜態屬性
、靜態方法
、類別常數
和普通方法
。
以上是如果還有一次機會,重寫override就是你的出路的詳細內容。更多資訊請關注PHP中文網其他相關文章!