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不能訪問父類中的屬性(靜態屬性和常量可以)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM