定義:重寫(override),即子類中定義了與父類重名的成員,子類可以重寫父類任意類成員,通常重寫是用來(lái)重寫父類的方法,用于擴(kuò)展或者更改某些業(yè)務(wù)邏輯。
1.不管是公有和是受保護(hù)屬性
,一旦重寫
,父類
的就會(huì)不存在,而私有屬性
不會(huì)被覆蓋而丟失。
<?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 ?>
可以發(fā)現(xiàn)無(wú)論是公有屬性
,還是受保護(hù)屬性
都被覆蓋
,而私有屬性
因?yàn)闆]有被繼承
,所以不受影響。
<?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>"; ?>
小結(jié):公有、受保護(hù)的屬性重寫是直接覆蓋父類成員,私有屬性不會(huì)被覆蓋;公有、收保護(hù)的方法會(huì)被重寫,但是私有方法不會(huì)被重寫(私有方法本質(zhì)沒有被繼承)。
2.子類重寫父類方法的要求。
a. 子類重寫父類的方法,控制權(quán)不能高于父類,即子類可以比父類更開放。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ protected function show(){} //正確 public function show(){} //允許 private function show(){} //錯(cuò)誤:控制權(quán)比父類更嚴(yán)格 } ?>
b. PHP中重寫要求子類重寫父類方法的時(shí)候,必須保證與父類同名方法參數(shù)一致。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ public function show(){} public function show($a){} //錯(cuò)誤,與父類同名方法不一致 } ?>
c. 重寫針對(duì)的是被繼承的成員,父類私有方法不會(huì)被繼承,因此不受要求b規(guī)定。
<?php class Fu{ private function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ private function show($name){ //不會(huì)報(bào)錯(cuò),因?yàn)楸举|(zhì)不存在重寫(父類Fu::show沒有被繼承) echo $name,'<br/>'; } } ?>
d.重寫是指子類擁有特殊的情況,一般是需要在父類的基礎(chǔ)上進(jìn)行擴(kuò)展,此時(shí)如果想要繼續(xù)保證父類被重寫的方法繼續(xù)執(zhí)行(默認(rèn)永遠(yuǎn)只訪問(wèn)子類重寫的新方法),需要在子類重寫方法的時(shí)候使用parent
關(guān)鍵字。
<?php class Fu{ protected function show(){ echo __CLASS__,'<br/>'; } } class Zi extends Fu{ public function show(){ parent::show(); //擴(kuò)展業(yè)務(wù)邏輯 echo __CLASS__,'<br/>'; } }?>
小結(jié):parent
不能訪問(wèn)父類的屬性,可以訪問(wèn)靜態(tài)屬性
、靜態(tài)方法
、類常量
和普通方法
。
推薦:php教程,php視頻入門教程