亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php面向對象中子類中重載父類詳解

2024-09-04 11:43:36
字體:
來源:轉載
供稿:網友

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

子類中重載父類的方法,實例代碼如下:

  1. <?php 
  2.       class Person{ 
  3.                                                                 
  4.            public $name;       
  5.                                                                
  6.            public function __construct($name="" ){ 
  7.                 $this->name =$name
  8.                                                                         
  9.            } 
  10.            public  function say(){ 
  11.                 echo "我叫".$this->name  ;  
  12.            } 
  13.                                                                    
  14.  } 
  15.  ?> 
  16.  <?php 
  17.       class Student extends Person{ 
  18.                                                                 
  19.            public $name;               
  20.                                                                
  21.            public function __construct($name=""){ 
  22.                 $this->name =$name
  23.                                                            
  24.            } 
  25.  //這里定義了一個和父類中同名的方法,將父類中的說話方法覆蓋并重寫 
  26.            public  function say(){ 
  27.                 echo "我叫".$this->name .",今年25歲了" ;  
  28.            } 
  29.                                                                    
  30.  } 
  31.  ?> 

重寫方法與訪問權限

子類中的覆蓋方法不能使用比父類中被覆蓋方法更嚴格的訪問權限,如果父類中的方法的訪問權限是protected,那么子類中重寫的方法的權限就要是protected或者public;    如果父類中的方法是public,那么子類要重寫的方法的權限就只能是public。也許這也就是為什么子類可以繼承父類的私有成員,但卻不能使用的原因吧。

重寫時的參數數量

子類可以擁有與父類不同的參數數量,如下面的構造方法中,多添加了一個參數$age,實例代碼如下:

  1. <?php  
  2.       class Student extends Person{  
  3.                                                  
  4.            public $name;       
  5.           public $age;           
  6.                                                  
  7.            public function __construct($name="",$age=25){   
  8.                 $this->name =$name;  
  9.                 $this->age =$age;  
  10.           }  
  11.           public  function say(){  
  12.                 echo "我叫".$this->name .",今年".$this->age."歲了" ;    
  13.            }    
  14.                                                     
  15.  }   
  16.  ?> 

構造函數重寫

上面提到的“重寫時的參數數量”就已經實現了子類對父類的構造函數進行了重寫,但這不是一種好的寫法,如果仔細觀察,你會發現,上面子類Student對父類Person構造函數的重寫,其實就是在父類的構造函數的基礎上多添加了一個參數,但是又把父類原有的參數照寫一遍,因為父類Person的構造函數只有一個參數,所以我們照寫一遍不覺得有什么麻煩,但是如果參數不止一個,而是幾個或者更多,那么你就會發現它的繁瑣之處,那么有沒有辦法可以簡化這個問題呢?答案是肯定的,可通過使用"parent::方法名" 在子類的重載方法中調用父類中被它覆蓋的方法,如使用"parent::__construct()"調用父類中被覆蓋的構造方法,其它方法的類似,于是上面的代碼可以簡化為:

  1. <?php  
  2.       class Student extends Person{  
  3.                                        
  4.            public $name;      
  5.            public $age;           
  6.                                        
  7.           public function __construct($name="",$age=25){  
  8.               parent::__construct($name,$age);  
  9.               $this->age =$age;   
  10.          }  
  11.            public  function say(){   
  12.              parent::say();  
  13.               echo ",今年".$this->age."歲了" ;    
  14.           }    
  15.                                            
  16.  }   
  17.  ?> 

下再看一個實例

PHP5重寫方法

先設置一個父類,這個父類是 “Dog”類,這個類描述了dog的特性,Dog有2個眼睛,會跑,會叫。就這樣描述先,我養了一直狗,是只小狗,符合Dog類的特性,但有所不同,我的小狗有名字,我的小狗太小了,不會大聲的叫,只會哼哼,我們用繼承的概念去實現這個設計,代碼如下:

  1. <? 
  2. // 狗有兩只眼睛,會汪汪叫,會跑. 
  3. class  Dog { 
  4.  protected  $eyeNumber =2; //屬性 
  5.  //返回封裝屬性的方法. 
  6.  public function getEyeNumber(){  
  7.   return $this->eyeNumber; 
  8.  } 
  9.  //狗會叫  
  10.  public function  yaff(){ 
  11.   return  "Dog yaff, wang ..wang .."
  12.  } 
  13.  //狗會跑 
  14.  public function  run(){ 
  15.   return  "Dog run..running ..."
  16.  } 
  17. $dog = new Dog(); 
  18. echo "dog have ".$dog->getEyeNumber()." eyes. <br>"
  19. echo $dog->yaff() ."<br>".$dog->run(); 
  20. echo  "<br><br>"
  21. //這是我的小狗叫"狗狗",它很小.不會汪汪叫,只會哼哼哼.. 
  22. class MyDog extends Dog { 
  23.  private $name = "狗狗"
  24.  public function getName(){ 
  25.   return $this->name; 
  26.  } 
  27.     public function  yaff(){ 
  28.   return  $this->name." yaff, heng...heng .."
  29.  }  
  30. $myDog = new MyDog(); 
  31. echo $myDog->getName()." have ".$myDog->getEyeNumber()." eyes. <br>"
  32. echo $myDog->yaff() ."<br>".$myDog->run(); 
  33. ?> 
  34. //程序運行結果: 
  35. //dog have 2 eyes.  
  36. //Dog yaff, wang ..wang .. 
  37. //Dog run..running ... 
  38. //狗狗 have 2 eyes.  
  39. //狗狗 yaff, heng...heng .. 
  40. //Dog run..running ... 

重寫方法與訪問權限

子類中的覆蓋方法不能使用比父類中被覆蓋方法更嚴格的訪問權限,父類為public 子類為 private時,實例代碼如下:

  1. <? 
  2. // 簡化dog類和mydog類,演示重寫的訪問權限. 
  3. class Dog { 
  4.  protected  $eyeNumber =2; //屬性 
  5.  //返回封裝屬性的方法. 
  6.  public function getEyeNumber(){  
  7.   return $this->eyeNumber; 
  8.  }  
  9. class MyDog extends Dog { 
  10.  protected function getEyeNumber(){  
  11.   return $this->eyeNumber; 
  12.  }  
  13. /* 
  14. class MyDog extends Dog { 
  15.  private function getEyeNumber(){  
  16.   return $this->eyeNumber; 
  17.  }  
  18. } 
  19. */ 
  20. ?> 
  21. //程序運行結果: 
  22. //Fatal error: Access level to MyDog::getEyeNumber() must be public (as in class Dog) in E:PHPProjectstest.php on line 15 

父類為public子類為protected時,實例代碼如下:

  1. <?php 
  2. // 簡化dog類和mydog類,演示重寫的訪問權限. 
  3. class Dog { 
  4.  protected  $eyeNumber =2; //屬性 
  5.  //返回封裝屬性的方法. 
  6.  public function getEyeNumber(){  
  7.   return $this->eyeNumber; 
  8.  }  
  9. class MyDog extends Dog { 
  10.  private function getEyeNumber(){  
  11.   return $this->eyeNumber; 
  12.  }  
  13. ?> 
  14. //程序運行結果: 
  15.  //Fatal error: Access level to MyDog::getEyeNumber() must be public (as in class Dog) in E:PHPProjectstest.php on line 15 

重寫時的參數數量

子類可以擁有與父類不同的參數數量,這點與java不同,PHP是弱類型語言,實例代碼如下:

  1. <? 
  2. // 簡化dog類和mydog類,演示重寫方法的參數. 
  3. class  Dog { 
  4.  protected  $eyeNumber =2; //屬性 
  5.  //返回封裝屬性的方法. 
  6.  public function getEyeNumber(){  
  7.   return $this->eyeNumber; 
  8.  }  
  9. class MyDog extends Dog { 
  10.  //重寫的方法與父類的方法有不同的參數數量. 
  11.  public function getEyeNumber($eys){ 
  12.   $this->eyeNumber = $eys
  13.   return $this->eyeNumber; 
  14.  }  
  15. $myDog = new MyDog(); 
  16. echo "my dog hava ".$myDog->getEyeNumber(3) ." eyes."
  17. //嘯天犬..哈.. 
  18. //下面這句會報一個丟失參數的錯誤. 
  19. //echo "my dog hava ".$myDog->getEyeNumber() ." eyes."; 
  20. ?> 
  21. //程序運行結果: 
  22. //my dog hava 3 eyes. 

構造函數重寫

下面這個例子中,父類和子類都有自己的構造函數,當子類被實例化時,子類的構造函數被調用,而父類的構造函數沒有被調用,請對比第一節的構造函數繼承,實例代碼如下:

  1. <? 
  2. //2-2 / extends1.php 
  3. //構造函數繼承的問題. 
  4. class Animal{ 
  5.  public $legNum = 0;  
  6.  public function __construct(){ 
  7.   $this->legNum = 4; 
  8.   echo "I am an animal<br>"
  9.  } 
  10. class Dog1 extends Animal { 
  11.  public function __construct(){ 
  12.   $this->legNum = 4; 
  13.   echo "I am a Dog .<br>"
  14.  } 
  15. $dog1 = new Dog1(); 
  16. echo "<br>"
  17. echo  "legNum is ".$dog1->legNum; 
  18. /* 
  19. 實例化子類時.構造函數被調用了. 
  20. */ 
  21. ?> 
  22. //程序運行結果: 
  23. //I am a Dog .   
  24. //legNum is 4 

注:這點和Java不同,在java中構造函數是不能被繼承的,而且子類實例化時,子類的構造函數被調用,父類的構造函數也會調用.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品福利在线观看| yw.139尤物在线精品视频| 国产成人精品久久二区二区| 欧美视频不卡中文| 午夜精品久久久99热福利| 北条麻妃久久精品| 亚洲国产成人在线播放| 久久亚洲精品国产亚洲老地址| 日韩欧美国产一区二区| 色先锋资源久久综合5566| 国产精品视频导航| 日韩日本欧美亚洲| 亚洲成人av在线播放| 91免费高清视频| 中日韩美女免费视频网站在线观看| 精品亚洲夜色av98在线观看| 国产精品91久久久| 久久夜色精品国产| 久久久精品国产网站| 亚洲曰本av电影| 91久久精品国产91性色| 北条麻妃一区二区三区中文字幕| 91精品国产综合久久香蕉最新版| 国产日韩欧美影视| 亚洲aaaaaa| 91精品在线一区| 揄拍成人国产精品视频| 日韩精品电影网| 97国产suv精品一区二区62| 久久人人爽人人爽人人片av高请| 精品视频在线观看日韩| 国产精品亚洲片夜色在线| 国产日韩欧美视频| 亚洲人午夜色婷婷| 国产区亚洲区欧美区| www.色综合| 欧美成人网在线| 日韩av在线网| 欧美最顶级丰满的aⅴ艳星| 九九热精品视频在线播放| 亚洲级视频在线观看免费1级| 国产精品劲爆视频| 日韩av一区二区在线观看| 最近中文字幕mv在线一区二区三区四区| 久久视频精品在线| xxx成人少妇69| 97精品免费视频| 欧美成人精品激情在线观看| 亚洲欧洲自拍偷拍| 日韩av片永久免费网站| 中文字幕日韩免费视频| 亚洲欧美在线看| 麻豆国产精品va在线观看不卡| 欧美黄色小视频| 日韩av一区二区在线观看| 日韩av最新在线观看| 日韩亚洲欧美中文在线| 欧美激情在线狂野欧美精品| 久久中文字幕一区| 国产又爽又黄的激情精品视频| 91久久久在线| 日韩在线观看免费全| 国产午夜精品一区二区三区| 久久偷看各类女兵18女厕嘘嘘| 九九久久久久久久久激情| 色阁综合伊人av| 91夜夜揉人人捏人人添红杏| 韩国国内大量揄拍精品视频| 亚洲精品456在线播放狼人| 日韩视频―中文字幕| 日韩av片永久免费网站| 欧美日韩亚洲一区二区| 精品成人av一区| 久久天天躁夜夜躁狠狠躁2022| 久久久999国产| 日韩电影中文字幕在线| 九九热在线精品视频| 国产精品一区二区性色av| 中文字幕九色91在线| 久久躁日日躁aaaaxxxx| 欧美自拍视频在线| 欧美亚洲一区在线| 亚洲福利视频网站| 欧美日韩成人黄色| yellow中文字幕久久| 7777精品视频| 久久人体大胆视频| 51久久精品夜色国产麻豆| 日韩av在线电影网| 亚洲视频精品在线| 精品国产一区二区三区久久狼5月| 久久视频在线播放| 国产精品久久久久久久久久小说| 欧美亚洲另类制服自拍| 91精品国产乱码久久久久久久久| 国内精品视频一区| 日韩hd视频在线观看| 欧美专区在线观看| 久久天天躁狠狠躁老女人| 亚洲精品国产品国语在线| 久久99国产精品自在自在app| 日韩少妇与小伙激情| 亚洲欧美日韩中文在线制服| 欧美福利小视频| 色噜噜国产精品视频一区二区| 91夜夜揉人人捏人人添红杏| 日韩在线中文字幕| 亚洲欧洲在线视频| 国产精品久久久久久久久久ktv| 亚洲国产高清福利视频| 亚洲性线免费观看视频成熟| 免费av在线一区| 深夜福利日韩在线看| 亚洲国产另类 国产精品国产免费| 亚洲剧情一区二区| 福利视频第一区| 亚洲国产一区自拍| 亚洲网站在线播放| 曰本色欧美视频在线| 91久久精品国产| 亚洲香蕉在线观看| 97久久超碰福利国产精品…| 国产精品视频26uuu| 久99久在线视频| 日韩经典中文字幕| 久久久久999| 911国产网站尤物在线观看| 91精品久久久久久久久中文字幕| 久久久久久久久久久国产| 国产69精品久久久久9| 成人免费直播live| 国产中文字幕亚洲| 国产精品h在线观看| 欧美猛交ⅹxxx乱大交视频| 色综合亚洲精品激情狠狠| 日韩在线一区二区三区免费视频| 亚洲肉体裸体xxxx137| 中文字幕亚洲一区二区三区五十路| 国产亚洲a∨片在线观看| 亚洲综合在线做性| 国产一区二区三区在线播放免费观看| 欧美日韩成人黄色| 1769国内精品视频在线播放| 夜夜嗨av色综合久久久综合网| 亚洲精品99久久久久中文字幕| 欧美又大又粗又长| 亚洲一级黄色片| 自拍偷拍亚洲在线| 精品在线欧美视频| 欧美最猛性xxxxx免费| 成人免费视频网| 亚洲aⅴ男人的天堂在线观看| 亚洲国产精品久久久久| 亚洲成人精品在线| 国产精品久久久久久久久久新婚| 亚洲精品综合精品自拍| 国产亚洲人成网站在线观看| 久久激情五月丁香伊人| 国产91免费观看| 国产免费一区二区三区香蕉精| 国产精品久久久久久久久粉嫩av| 国产视频久久久久| 美女扒开尿口让男人操亚洲视频网站| 亚洲精品第一国产综合精品|