久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      PHP中多態(tài)性是什么意思

      在PHP中,多態(tài)性是指同一個(gè)操作作用于不同的類(lèi)的實(shí)例,將產(chǎn)生不同的執(zhí)行結(jié)果。也即不同類(lèi)的對(duì)象收到相同的消息時(shí),將得到不同的結(jié)果;不同的對(duì)象,收到同一消息將可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱(chēng)為多態(tài)性。多態(tài)性允許每個(gè)對(duì)象以適合自身的方式去響應(yīng)共同的消息;多態(tài)性增強(qiáng)了軟件的靈活性和重用性。

      PHP中多態(tài)性是什么意思

      本教程操作環(huán)境:windows7系統(tǒng)、PHP8版、DELL G3電腦

      PHP 多態(tài)性

      多態(tài)性是指相同的操作或函數(shù)、過(guò)程可作用于多種類(lèi)型的對(duì)象上并獲得不同的結(jié)果。不同的對(duì)象,收到同一消息將可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱(chēng)為多態(tài)性。

      多態(tài)性允許每個(gè)對(duì)象以適合自身的方式去響應(yīng)共同的消息。多態(tài)性增強(qiáng)了軟件的靈活性和重用性。

      在面向?qū)ο蟮能浖_(kāi)發(fā)中,多態(tài)性是最為重要的部分之一。面向?qū)ο缶幊滩⒉恢皇菍⑾嚓P(guān)的方法與數(shù)據(jù)簡(jiǎn)單的結(jié)合起來(lái),而是采用面向?qū)ο缶幊讨械母鞣N要素將現(xiàn)實(shí)生活中的各種情況清晰的描述出來(lái)。這一小節(jié)將對(duì)面向?qū)ο缶幊讨械亩鄳B(tài)性作詳細(xì)的講解。

      1.什么是多態(tài)

      多 態(tài)(Polymorphism)按字面上意思理解就是“多種形狀”??梢岳斫鉃槎喾N表現(xiàn)形式,也即“一個(gè)對(duì)外接口,多個(gè)內(nèi)部實(shí)現(xiàn)方法”。在面向?qū)ο蟮睦碚?中,多態(tài)性的一般定義為:同一個(gè)操作作用于不同的類(lèi)的實(shí)例,將產(chǎn)生不同的執(zhí)行結(jié)果。也即不同類(lèi)的對(duì)象收到相同的消息時(shí),將得到不同的結(jié)果。

      在實(shí)際的應(yīng)用開(kāi)發(fā)中,采用面向?qū)ο笾械亩鄳B(tài)主要在于可以將不同的子類(lèi)對(duì)象都當(dāng)作一個(gè)父類(lèi)來(lái)處理,并且可以屏蔽不同子類(lèi)對(duì)象之間所存在的差異,寫(xiě)出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。

      2. 多態(tài)的應(yīng)用設(shè)計(jì)

      在實(shí)際的應(yīng)用開(kāi)發(fā)中,通常為了使項(xiàng)目能夠在以后的時(shí)間里的輕松實(shí)現(xiàn)擴(kuò)展與升級(jí),需要通過(guò)繼承實(shí)現(xiàn)可復(fù)用模塊進(jìn)行輕松升級(jí)。在進(jìn)行可復(fù)用模塊設(shè)計(jì)時(shí),就需要盡可能的減少使用流程控制語(yǔ)句。此時(shí)就可以采用多態(tài)實(shí)現(xiàn)該類(lèi)設(shè)計(jì)。

      【示例】例舉了通常采用流程控制語(yǔ)句實(shí)現(xiàn)不同類(lèi)的處理。其代碼如下所示。

      class painter{ //定義油漆工類(lèi) public function paintbrush(){ //定義油漆工動(dòng)作 echo "油漆工正在刷漆!n"; } } class typist{ //定義打字員類(lèi) public function typed(){ //定義打字員工作 echo "打字員正在打字!n"; } } function printworking($obj){ //定義處理類(lèi) if(objinstanceofpainter)//若對(duì)象是油漆工類(lèi),則顯示油漆工動(dòng)作$obj?>paintbrush();elseif(obj instanceof typist){ //若對(duì)象是打字員類(lèi),則顯示打字員動(dòng)作 $obj->typed(); }else{ //若非以上類(lèi),則顯示出錯(cuò)信息 echo "Error: 對(duì)象錯(cuò)誤!"; } } printworking(new painter()); //顯示員工工作 printworking(new typist()); //顯示員工工作
      登錄后復(fù)制

      分析:在上述程序中,首先定義兩個(gè)員工類(lèi):油漆工類(lèi)和打字員類(lèi)。然后定義一個(gè)處理函數(shù),在該函數(shù)中,判斷員工是否為已經(jīng)定義的員工,打印出員工的工作狀態(tài)。其結(jié)果如下所示。

      油漆工正在刷漆   打字員正在打字
      登錄后復(fù)制

      從 以上程序可輕松看出,若想顯示其幾種員工的工作狀態(tài),需要首先定義該員工類(lèi),并在該員工類(lèi)中定義員工的工作,然后在printworking()函數(shù)中增 加elseif語(yǔ)句以檢查對(duì)象是哪一員工類(lèi)的實(shí)例。這在實(shí)際的應(yīng)用中,是非常不可取的。若此時(shí)采用多態(tài),則可以輕松解決此問(wèn)題。

      可以首先創(chuàng)建一個(gè)員工父類(lèi),所有的員工類(lèi)將繼承自該員工父類(lèi),并且繼承父類(lèi)的所有方法與屬性。然后在員工類(lèi)中創(chuàng)建“是一”關(guān)系,判斷是否為合法的員工。

      【示例】例舉了采用多態(tài)的方式改寫(xiě)上例。其代碼如下所示。

      class employee{//定義員工父類(lèi) protected function working(){//定義員工工作,需要在子類(lèi)的實(shí)現(xiàn) echo "本方法需要在子類(lèi)中重載!"; } } class painter extends employee{//定義油漆工類(lèi) public function working(){//實(shí)現(xiàn)繼承的工作方法 echo "油漆工正在刷漆!n"; } } class typist extends employee{//定義打字員類(lèi) public function working(){ echo "打字員正在打字!n"; } } class manager extends employee{//定義經(jīng)理類(lèi) public function working(){ echo "經(jīng)理正在開(kāi)會(huì)!"; } } function printworking($obj){//定義處理方法 if($obj instanceof employee){//若是員工對(duì)象,則顯示其工作狀態(tài) $obj->working(); }else{//否則顯示錯(cuò)誤信息 echo "Error: 對(duì)象錯(cuò)誤!"; } } printworking(new painter());//顯示油漆工的工作 printworking(new typist());//顯示打字員的工作 printworking(new manager());//顯示經(jīng)理的工作
      登錄后復(fù)制

      分析:在上述程序中,首先定義一個(gè)員工基類(lèi),并定義一個(gè)員工工作狀態(tài)的方法。然后定義將繼承自員工基類(lèi)的三個(gè)員工類(lèi):油漆工類(lèi)、打字員類(lèi)和經(jīng)理類(lèi)。然后定義顯示員工工作狀態(tài)的方法。并在該方法中創(chuàng)建一個(gè)“是一”關(guān)系,用于判斷是否為合法的員工。其結(jié)果如下所示。

      油漆工正在刷漆!  打字員正在打字!  經(jīng)理正在開(kāi)會(huì)!
      登錄后復(fù)制

      從上例可發(fā)現(xiàn),無(wú)論增加多少個(gè)員工類(lèi),只需要實(shí)現(xiàn)自員工父類(lèi)繼承的該員工類(lèi)和方法。而無(wú)須修改顯示員工工作狀態(tài)的方法printworking()。

      實(shí)現(xiàn)php多態(tài)的兩種方法

      在PHP5中,變量的類(lèi)型是不確定的,一個(gè)變量可以指向任何類(lèi)型的數(shù)值、字符串、對(duì)象、資源等。我們無(wú)法說(shuō)PHP5中多態(tài)的是變量。

      我們只能說(shuō)在PHP5中,多態(tài)應(yīng)用在方法參數(shù)的類(lèi)型提示位置。

      一個(gè)類(lèi)的任何子類(lèi)對(duì)象都可以滿(mǎn)足以當(dāng)前類(lèi)型作為類(lèi)型提示的類(lèi)型要求。

      所有實(shí)現(xiàn)這個(gè)接口的類(lèi),都可以滿(mǎn)足以接口類(lèi)型作為類(lèi)型提示的方法參數(shù)要求。

      簡(jiǎn)單的說(shuō),一個(gè)類(lèi)擁有其父類(lèi)、和已實(shí)現(xiàn)接口的身份。

      通過(guò)實(shí)現(xiàn)接口實(shí)現(xiàn)多態(tài)

      <?php interface User{ // User接口     public function  getName();     public function setName($_name); } class NormalUser implements User { // 實(shí)現(xiàn)接口的類(lèi).     private $name;     public function getName(){         return $this->name;     }     public function setName($_name){         $this->name = $_name;     } } class UserAdmin{ //操作.     public  static  function  ChangeUserName(User $_user,$_userName){         $_user->setName($_userName);     } } $normalUser = new NormalUser(); UserAdmin::ChangeUserName($normalUser,"Tom");//這里傳入的是 NormalUser的實(shí)例. echo $normalUser->getName(); ?>
      登錄后復(fù)制

      使用接口與組合模擬多繼承

      通過(guò)組合模擬多重繼承。

      在PHP中不支持多重繼承,如果我們向使用多個(gè)類(lèi)的方法而實(shí)現(xiàn)代碼重用有什么辦法么?

      那就是組合。在一個(gè)類(lèi)中去將另外一個(gè)類(lèi)設(shè)置成屬性。

      下面的例子,模擬了多重繼承。

      接口實(shí)例

      寫(xiě)一個(gè)概念性的例子。 我們?cè)O(shè)計(jì)一個(gè)在線銷(xiāo)售系統(tǒng),用戶(hù)部分設(shè)計(jì)如下: 將用戶(hù)分為,NormalUser, VipUser, InnerUser 三種。要求根據(jù)用戶(hù)的不同折扣計(jì)算用戶(hù)購(gòu)買(mǎi)產(chǎn)品的價(jià)格。并要求為以后擴(kuò)展和維護(hù)預(yù)留空間。

      <?php interface User {     public function getName();     public function setName($_name);     public function getDiscount(); } abstract class AbstractUser implements User {     private $name = "";     protected  $discount = 0;     protected  $grade = "";     function construct($_name) {         $this->setName($_name);      }     function getName() {         return $this->name;     }     function setName($_name) {     $this->name = $_name;     }     function getDiscount() {         return $this->discount;     }     function getGrade() {         return $this->grade;     } } class NormalUser  extends  AbstractUser {     protected $discount = 1.0;     protected $grade = "Normal"; } class VipUser extends AbstractUser {     protected $discount = 0.8;     protected $grade = "VipUser"; } class InnerUser extends AbstractUser {     protected $discount = 0.7;     protected $grade = "InnerUser"; } interface Product {     function getProductName();     function getProductPrice(); } interface Book extends Product {     function getAuthor(); } class BookOnline implements Book {     private $productName;     protected $productPrice;     protected $Author;     function construct($_bookName) {         $this->productName = $_bookName;     }     function getProductName() {         return $this->productName;     }     function getProductPrice() {         $this->productPrice = 100;         return $this->productPrice;     }     public function getAuthor() {         $this->Author = "chenfei";         return $this->Author;     } } class Productsettle {     public static function finalPrice(User $_user, Product $_product, $number) {         $price = $_user->getDiscount() * $_product->getProductPrice() * $number;         return $price;     } } $number = 10; $book = new BookOnline(" 設(shè)計(jì)模式 "); $user = new NormalUser("tom"); $price = Productsettle::finalPrice($user, $book, $number); $str = "您好,尊敬的" . $user->getName() . "<br />"; $str .= "您的級(jí)別是" . $user->getGrade() . "<br />"; $str .= "您的折扣是" . $user->getDiscount() . "<br />"; $str .= "您的價(jià)格是" . $price; echo $str; ?>
      登錄后復(fù)制

      推薦學(xué)習(xí):《PHP視頻教程》

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)