方法的重载【转】
如果從父類(lèi)繼承的方法不能滿(mǎn)足子類(lèi)的需求,可以對(duì)其進(jìn)行改寫(xiě),這個(gè)過(guò)程叫方法的覆蓋(override),也稱(chēng)為方法的重載。
當(dāng)對(duì)父類(lèi)的方法進(jìn)行重寫(xiě)時(shí),子類(lèi)中的方法必須和父類(lèi)中對(duì)應(yīng)的方法具有相同的方法名稱(chēng),在PHP5中不限制輸入?yún)?shù)類(lèi)型、參數(shù)數(shù)量和返回值類(lèi)型。(這點(diǎn)和Java不同)。
子類(lèi)中的覆蓋方法不能使用比父類(lèi)中被覆蓋方法更嚴(yán)格的訪問(wèn)權(quán)限。
聲明方法時(shí),如果不定義訪問(wèn)權(quán)限。默認(rèn)權(quán)限為public。
PHP5重寫(xiě)方法
先設(shè)置一個(gè)父類(lèi),這個(gè)父類(lèi)是 “Dog”類(lèi),這個(gè)類(lèi)描述了dog的特性。
Dog有2個(gè)眼睛,會(huì)跑,會(huì)叫。就這樣描述先。
我養(yǎng)了一直狗,是只小狗,符合Dog類(lèi)的特性,但有所不同。
我的小狗有名字,我的小狗太小了,不會(huì)大聲的叫,只會(huì)哼哼。
我們用繼承的概念去實(shí)現(xiàn)這個(gè)設(shè)計(jì)。
1 <? 2 // 狗有兩只眼睛,會(huì)汪汪叫,會(huì)跑. 3 class Dog { 4 protected $eyeNumber =2; //屬性 5 //返回封裝屬性的方法. 6 public function getEyeNumber(){ 7 return $this->eyeNumber; 8 } 9 //狗會(huì)叫 10 public function yaff(){ 11 return "Dog yaff, wang ..wang .."; 12 } 13 //狗會(huì)跑 14 public function run(){ 15 return "Dog run..running ..."; 16 } 17 } 18 $dog = new Dog(); 19 echo "dog have ".$dog->getEyeNumber()." eyes. <br>"; 20 echo $dog->yaff() ."<br>".$dog->run(); 21 echo "<br><br>"; 22 //這是我的小狗叫"狗狗",它很小.不會(huì)汪汪叫,只會(huì)哼哼哼.. 23 class MyDog extends Dog { 24 private $name = "狗狗"; 25 public function getName(){ 26 return $this->name; 27 } 28 public function yaff(){ 29 return $this->name." yaff, heng...heng .."; 30 } 31 } 32 $myDog = new MyDog(); 33 echo $myDog->getName()." have ".$myDog->getEyeNumber()." eyes. <br>"; 34 echo $myDog->yaff() ."<br>".$myDog->run(); 35 ?>?
程序運(yùn)行結(jié)果:
dog have 2 eyes. Dog yaff, wang ..wang .. Dog run..running ... 狗狗 have 2 eyes. 狗狗 yaff, heng...heng .. Dog run..running ...?
重寫(xiě)方法與訪問(wèn)權(quán)限
子類(lèi)中的覆蓋方法不能使用比父類(lèi)中被覆蓋方法更嚴(yán)格的訪問(wèn)權(quán)限。
父類(lèi)為public 子類(lèi)為 private時(shí)。
1 <? 2 // 簡(jiǎn)化dog類(lèi)和mydog類(lèi),演示重寫(xiě)的訪問(wèn)權(quán)限. 3 class Dog { 4 protected $eyeNumber =2; //屬性 5 //返回封裝屬性的方法. 6 public function getEyeNumber(){ 7 return $this->eyeNumber; 8 } 9 } 10 class MyDog extends Dog { 11 protected function getEyeNumber(){ 12 return $this->eyeNumber; 13 } 14 } 15 /* 16 class MyDog extends Dog { 17 private function getEyeNumber(){ 18 return $this->eyeNumber; 19 } 20 } 21 */ 22 ?>?
程序運(yùn)行結(jié)果:
Fatal error: Access level to MyDog::getEyeNumber() must be public (as in class Dog) in E:\PHPProjects\test.php on line *父類(lèi)為public 子類(lèi)為 protected時(shí)。
<? // 簡(jiǎn)化dog類(lèi)和mydog類(lèi),演示重寫(xiě)的訪問(wèn)權(quán)限. class Dog {protected $eyeNumber =2; //屬性//返回封裝屬性的方法.public function getEyeNumber(){ return $this->eyeNumber;} } class MyDog extends Dog {private function getEyeNumber(){ return $this->eyeNumber;} } ?>?
程序運(yùn)行結(jié)果:
Fatal error: Access level to MyDog::getEyeNumber() must be public (as in class Dog) in E:\PHPProjects\test.php on line *重寫(xiě)時(shí)的參數(shù)數(shù)量
子類(lèi)可以擁有與父類(lèi)不同的參數(shù)數(shù)量。(這點(diǎn)與java不同,PHP是弱類(lèi)型語(yǔ)言。)
1 <? 2 // 簡(jiǎn)化dog類(lèi)和mydog類(lèi),演示重寫(xiě)方法的參數(shù). 3 class Dog { 4 protected $eyeNumber =2; //屬性 5 //返回封裝屬性的方法. 6 public function getEyeNumber(){ 7 return $this->eyeNumber; 8 } 9 } 10 class MyDog extends Dog { 11 //重寫(xiě)的方法與父類(lèi)的方法有不同的參數(shù)數(shù)量. 12 public function getEyeNumber($eys){ 13 $this->eyeNumber = $eys; 14 return $this->eyeNumber; 15 } 16 } 17 $myDog = new MyDog(); 18 echo "my dog hava ".$myDog->getEyeNumber(3) ." eyes."; 19 //嘯天犬..哈.. 20 //下面這句會(huì)報(bào)一個(gè)丟失參數(shù)的錯(cuò)誤. 21 //echo "my dog hava ".$myDog->getEyeNumber() ." eyes."; 22 ?>?
程序運(yùn)行結(jié)果:
1 my dog hava 3 eyes. 構(gòu)造函數(shù)重寫(xiě)下面這個(gè)例子中,父類(lèi)和子類(lèi)都有自己的構(gòu)造函數(shù),當(dāng)子類(lèi)被實(shí)例化時(shí),子類(lèi)的構(gòu)造函數(shù)被調(diào)用,而父類(lèi)的構(gòu)造函數(shù)沒(méi)有被調(diào)用,請(qǐng)對(duì)比第一節(jié)的構(gòu)造函數(shù)繼承。
1 <? 2 //2-2 / extends1.php 3 //構(gòu)造函數(shù)繼承的問(wèn)題. 4 class Animal{ 5 public $legNum = 0; 6 public function __construct(){ 7 $this->legNum = 4; 8 echo "I am an animal<br>"; 9 } 10 } 11 class Dog1 extends Animal { 12 public function __construct(){ 13 $this->legNum = 4; 14 echo "I am a Dog .<br>"; 15 } 16 } 17 $dog1 = new Dog1(); 18 echo "<br>"; 19 echo "legNum is ".$dog1->legNum; 20 /* 21 實(shí)例化子類(lèi)時(shí).構(gòu)造函數(shù)被調(diào)用了. 22 */ 23 ?>?
程序運(yùn)行結(jié)果:
1 I am a Dog . 2 legNum is 4?
注:這點(diǎn)和Java不同,在java中構(gòu)造函數(shù)是不能被繼承的,而且子類(lèi)實(shí)例化時(shí),子類(lèi)的構(gòu)造函數(shù)被調(diào)用,父類(lèi)的構(gòu)造函數(shù)也會(huì)調(diào)用。
原文地址
轉(zhuǎn)載于:https://www.cnblogs.com/soongkun/p/4274968.html
總結(jié)
- 上一篇: FileUpload控件
- 下一篇: POJ1269:Intersecting