php面向對象之子類中重載父類的方法

主頁 > 學習 > php >

張兵 次瀏覽

摘要:因為在PHP中不能存在同名的函數,所以在同一個類中也就不能定義重名的方法。這里所說的重載是指在 子類中可以定義和父類同名的方法從而覆蓋從父類中繼承過來的方法。

因為在PHP中不能存在同名的函數,所以在同一個類中也就不能定義重名的方法。這里所說的重載是指在    子類中可以定義和父類同名的方法從而覆蓋從父類中繼承過來的方法。
 
子類中重載父類的方法
<?php
     class Person{
                                                             
          public $name;       
                                                            
          public function __construct($name="" ){
               $this->name =$name;
                                                                     
          }
          public  function say(){
               echo "我叫".$this->name  ;  
          } 
                                                                
}
?>
<?php
     class Student extends Person{
                                                             
          public $name;               
                                                            
          public function __construct($name=""){
               $this->name =$name;
                                                        
          }
//這里定義了一個和父類中同名的方法,將父類中的說話方法覆蓋并重寫
          public  function say(){
               echo "我叫".$this->name .",今年25歲了" ;  
          } 
                                                                
}
?>
 
重寫方法與訪問權限
 
子類中的覆蓋方法不能使用比父類中被覆蓋方法更嚴格的訪問權限。
 
如果父類中的方法的訪問權限是protected,那么子類中重寫的方法的權限就要是protected或者public;    如果父類中的方法是public,那么子類要重寫的方法的權限就只能是public。也許這也就是為什么子類可    以繼承父類的私有成員,但卻不能使用的原因吧。
 
 
重寫時的參數數量
 
子類可以擁有與父類不同的參數數量,如下面的構造方法中,多添加了一個參數$age。
<?php
     class Student extends Person{
                                              
          public $name;    
          public $age;        
                                             
          public function __construct($name="",$age=25){
               $this->name =$name;
               $this->age =$age;
          }
          public  function say(){
               echo "我叫".$this->name .",今年".$this->age."歲了" ;  
          } 
                                                 
}
?>
構造函數重寫
 
上面提到的“重寫時的參數數量”就已經實現了子類對父類的構造函數進行了重寫,但這不是一種好的寫    法,如果仔細觀察,你會發現,上面子類Student對父類Person構造函數的重寫,其實就是在父類的構造    函數的基礎上多添加了一個參數,但是又把父類原有的參數照寫一遍,因為父類Person的構造函數只有一    個參數,所以我們照寫一遍不覺得有什么麻煩,但是如果參數不止一個,而是幾個或者更多,那么你就會    發現它的繁瑣之處,那么有沒有辦法可以簡化這個問題呢?答案是肯定的,可通過使用"parent::方法名"    在子類的重載方法中調用父類中被它覆蓋的方法。如使用"parent::__construct()"調用父類中被覆蓋的    構造方法,其它方法的類似,于是上面的代碼可以簡化為:
 
<?php
     class Student extends Person{
                                   
          public $name;    
          public $age;        
                                  
          public function __construct($name="",$age=25){
              parent::__construct($name,$age);
              $this->age =$age;
          }
          public  function say(){
              parent::say();
               echo ",今年".$this->age."歲了" ;  
          } 
                                      
}
?>

隨機新聞
急速赛车收