人妻精品在线观看一区二区三区,蜜臀av精品一区二区三区网站,中文一区二区三区亚洲欧美,熟女人妇精品一区二区,人妻av在线观看视频,欧美日韩国产三级精品网站,黄色免费网站直接进入,超碰公开福利正在播放,国产毛片乡下农村妇女毛片

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

來源:php中文網(wǎng) | 2023-03-09 12:03:21 |

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

PHP 多態(tài)性

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

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


(資料圖)

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

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

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

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

2. 多態(tài)的應用設計

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

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

class painter{ //定義油漆工類public function paintbrush(){ //定義油漆工動作echo "油漆工正在刷漆!\n";}}class typist{ //定義打字員類public function typed(){ //定義打字員工作echo "打字員正在打字!\n";}}function printworking($obj){ //定義處理類if(objinstanceofpainter)//若對象是油漆工類,則顯示油漆工動作$obj?>paintbrush();elseif(obj instanceof typist){ //若對象是打字員類,則顯示打字員動作$obj->typed();}else{ //若非以上類,則顯示出錯信息echo "Error: 對象錯誤!";}}printworking(new painter()); //顯示員工工作printworking(new typist()); //顯示員工工作

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

油漆工正在刷漆  打字員正在打字

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

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

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

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

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

油漆工正在刷漆! 打字員正在打字! 經(jīng)理正在開會!

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

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

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

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

一個類的任何子類對象都可以滿足以當前類型作為類型提示的類型要求。

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

簡單的說,一個類擁有其父類、和已實現(xiàn)接口的身份。

通過實現(xiàn)接口實現(xiàn)多態(tài)

<?phpinterface User{ // User接口    public function  getName();    public function setName($_name);}class NormalUser implements User { // 實現(xiàn)接口的類.    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的實例.echo $normalUser->getName();?>

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

通過組合模擬多重繼承。

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

那就是組合。在一個類中去將另外一個類設置成屬性。

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

接口實例

寫一個概念性的例子。 我們設計一個在線銷售系統(tǒng),用戶部分設計如下: 將用戶分為,NormalUser, VipUser, InnerUser 三種。要求根據(jù)用戶的不同折扣計算用戶購買產(chǎn)品的價格。并要求為以后擴展和維護預留空間。

<?phpinterface 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("設計模式");$user = new NormalUser("tom");$price = Productsettle::finalPrice($user, $book, $number);$str = "您好,尊敬的" . $user->getName() . "<br />";$str .= "您的級別是" . $user->getGrade() . "<br />";$str .= "您的折扣是" . $user->getDiscount() . "<br />";$str .= "您的價格是" . $price;echo $str;?>

推薦學習:《PHP視頻教程》

以上就是PHP中多態(tài)性是什么意思的詳細內(nèi)容,更多請關注php中文網(wǎng)其它相關文章!

關鍵詞: