思考:子列可以從父類進行繼承,那如果子類與父類的成員重名了怎么辦?
引入:首先,類中定義的成員是允許出現與其他類同名的,但是這個過程如果出現了繼承,那么重名就存在重寫的問題。
重寫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不能訪問父類中的屬性(靜態屬性和常量可以)