电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP 5.0中多態性的實現方案淺析

瀏覽:87日期:2024-02-07 14:39:10

提要:本文將討論多態性的概念及其在面向對象設計中的應用,還將分析如何在PHP 5中使用多態性以及存在的優缺點。

PHP的最新發行版本中已經實現了對遲綁定的支持。當然,在使用其遲綁定功能時還存在很多問題。如果你使用的是更舊版本的PHP(我的服務器上運行的是PHP 5.0.1版本),那么你可能發現其中缺乏對于遲綁定的支持。因此,請注意本文中的代碼有可能無法工作在你特定的PHP 5版本中。

一、 PHP 5和多態性

本文想討論面向對象編程中最為重要的部分之一--多態性的設計。為了說明問題,我使用了PHP 5。在你繼續閱讀之前,請首先明確本文并不是完全有關于PHP的。盡管這種語言在以前的兩個主要版本中在快速開發方面已經取得很大的進步,但是,在其與更為成熟的語言如C++或者Java相匹敵之前,它對于對象的支持還要經歷一段歷程。

如果你是一位面向對象編程的入門者,那么本文可能不適合你,因為多態性這部分知識比較特別:一旦理解了它,你將永遠不會忘記。如果你想簡單了解一點對象編程和設計知識,并且當某人說'某個對象是多態的'時,還不十分清楚這是什么意思的話,那么本文正適合你。到本文最后,你應該知道什么是多態性以及如何把它應用到面向對象的設計中,并且你會了解PHP 5中對象編程的優點與不足。

二、什么是多態性?

多態性,其來自于dictionary.com的定義是'以不同形式,階段或者類型出現在獨立的組織中或者同種組織中,而不存在根本區別。'由該定義,我們可以認為,多態性是一種通過多種狀態或階段來描述相同對象的編程方式。其實,它的真正意義在于:實際開發中,我們只需要關注一個接口或基類的編程,而不必擔心一個對象所屬于的具體類(class)。

如果你熟悉設計模式,即使只是有個初步了解,那么你也會了解這個概念。事實上,多態性可能是基于模式設計編程中的最偉大的工具。它允許我們以一種邏輯的方式來組織相類似的對象從而實現在具體編碼時不必擔心對象的具體類型;而且,我們只需要對一個所期望的接口或基類編程即可。一個應用程序越抽象,則它就顯得越靈活--而多態性是對行為加以抽象的最好的方式之一。

例如,讓我們考慮一個叫Person的類。我們可以用稱為David,Charles和Alejandro的類來子類化Person。Person有一個抽象方法AcceptFeedback(),所有的子類都要實現這個方法。這意味著,任何使用基類Person的子類的代碼都能調用方法AcceptFeedback()。你不必檢查該對象是一個David還是一個Alejandro,僅知道它是一個Person就夠了。結果是,你的代碼只需關注'最小公分母'-Person類即可。

在這個示例中的Person類也可以被創建為一個接口。當然,與上面相比存在一些區別,主要在于:一個接口并沒有給出任何行為,而僅確定了一組規則。一個Person接口要求的是'你必須支持AddFeedback()方法',而一個Person類可以提供一些AddFeedback()方法的缺省代碼-你對之的理解可以是'如果你不選擇支持AddFeedback(),那么你應該提供一種缺省實現。'至于如何選擇接口或基類則并非本文的主題;但是,一般說來,你需要通過基類來實現一個缺省的方法。如果你能夠簡單地勾勒出你的類所要實現的一組期望的功能,那么你也可以使用一個接口。

三、應用多態性設計

我們將繼續使用Person基類的例子,現在讓我們分析一個非多態性的實現。下列示例中使用了不同類型的Person對象--這是一種非常不理想的編程方式。注意,實際的Person類被省略。目前為止,我們僅關心代碼調用的問題。

<?php $name = $_SESSION['name']; $myPerson = Person::GetPerson($name); switch (get_class($myPerson)){case 'David' : $myPerson->AddFeedback('Great Article!','Some Reader', date('Y-m-d')); break;case 'Charles': $myPerson->feedback[] = array('Some Reader', 'Great Editing!'); break;case 'Alejandro' : $myPerson->Feedback->Append('Awesome Javascript!'); break;default : $myPerson->AddFeedback('Yay!'); }?>

這個示例展示了行為不同的對象,還有一個switch語句用于區分不同的Person類對象,從而執行其各自相應的正確操作。注意,這里針對不同條件的回饋注釋是不同的。在實際應用程序開發中可能不會出現這種情形;我僅為了簡單地說明類實現中存在的區別。

下面的一個示例使用了多態性。

<?php $name = $_SESSION['name']; $myPerson = Person::GetPerson($name); $myPerson->AddFeedback('Great Article!', 'SomeReader', date('Y-m-d'));?>

注意,這里沒有switch語句,而最重要的是,缺乏有關Person::GetPerson()會返回什么類型的對象。而另一個Person::AddFeedback()是一個多態方法。行為完全是由具體類進行封裝的。請記住,在此無論我們使用的是David,Charles還是Alejandro,調用代碼從不必了解具體類的功能,而僅知道基類就可以了。

盡管我的示例并不完美,但是,從調用代碼的角度,它已經展示了多態性的基本用法。現在我們需要分析這些類的內部實現。從一個基類進行派生的一個最偉大的地方在于,該派生類能夠存取父類的行為,這種情況常常是缺省的實現,但是也可能出現在類繼承鏈中用于創建更為復雜的行為。下面是這種情況的一個簡單展示。

<?phpclass Person{ function AddFeedback($comment, $sender, $date){//把回饋添加到數據庫 }}class David extends Person{ function AddFeedback($comment, $sender){parent::AddFeedback($comment, $sender,date('Y-m-d')); }}?>

在此,David類中的AddFeedback方法實現中首先調用了Person::AddFeedback方法。你可能注意到,它模仿了C++,Java或C#中的方法重載。請記住,這僅是一個簡單化的示例,并且你編寫的實際代碼完全依賴于你的實際工程。

四、PHP 5中的遲綁定

依我的看法,遲綁定正是使得Java和C#如此引人注目的重要原因。它們允許基類方法用'this'或$this來調用方法(即使它們不存在于基類中或調用一個基類中的方法,它有可能為繼承類中的另一個版本所代替)。你可以認為如下的實現在PHP中是允許的:

<?phpclass Person{ function AddFeedback($messageArray) {$this->ParseFeedback($messageArray);//寫向數據庫 }}class David extends Person{ function ParseFeedback($messageArray){// 進行一些分析 }}?>

記住,在Person類中并沒有ParseFeedback。現在,假定你擁有這一部分實現代碼(為了本例說明問題起見),那么這會導致$myPerson成為一個David對象:

<?php$myPerson = Person::GetPerson($name);$myPerson->AddFeedback($messageArray);?>

出現分析錯誤!大致錯誤信息為,方法ParseFeedback并不存在或者一些類似的信息。關于PHP 5中的遲綁定我們就討論這些!下面我們再歸納一下遲綁定的概念。

遲綁定意味著,方法調用在最后時刻才綁定到目標對象。這意味著,當該方法被運行時刻調用時,那些對象已經有了一種具體類型。在我們上面的示例中,你調用了David::AddFeedback(),而既然David::AddFeedback()中的$this引用一個David對象,那么你可以邏輯地假定ParseFeedback()方法是存在的--但事實上它并不存在,因為AddFeedback()是在Person中定義的,并且從Person類中調用ParseFeedback()。不幸的是,沒有簡單的方法來消除PHP 5中的這種行為。這意味著,當你想創建一個靈活的多態類層次時你可能有點無能為力。

我必須指出,我選擇PHP 5作為本文的表達語言僅僅是因為:這種語言并沒有實現對象概念的完美抽象!因為PHP 5還處于其測試版本運行期,所以這是可以諒解的。另外,既然該語言中加入了抽象類和接口,遲綁定也應該被實現。

五、小結

至此,你應該基本了解什么是多態性以及為什么PHP 5在實現多態性方面并不完美。一般說來,你應該知道如何用一個多態性對象模型來封裝有條件的行為。當然,這樣會提高你的對象的靈活性,并且意味著更少的代碼實現。另外,通過封裝滿足一定條件的行為(具體要依賴于對象的狀態),你還提高了代碼的清晰程度。

標簽: PHP
主站蜘蛛池模板: 慢回弹测试仪-落球回弹测试仪-北京冠测精电仪器设备有限公司 | 首页-浙江橙树网络技术有限公司| 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 数显恒温油浴-电砂浴-高温油浴振荡器-常州迈科诺仪器有限公司 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 北京公寓出租网-北京酒店式公寓出租平台 | 定量包装秤,吨袋包装称,伸缩溜管,全自动包装秤,码垛机器人,无锡市邦尧机械工程有限公司 | 东莞画册设计_logo/vi设计_品牌包装设计 - 华略品牌设计公司 | 喷砂机厂家_自动除锈抛丸机价格-成都泰盛吉自动化喷砂设备 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 企业微信营销_企业微信服务商_私域流量运营_艾客SCRM官网 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 深圳市源和塑胶电子有限公司-首页 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 颗粒机,颗粒机组,木屑颗粒机-济南劲能机械有限公司 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 自动配料系统_称重配料控制系统厂家| 江西自考网 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 美名宝起名网-在线宝宝、公司、起名平台 | 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 新疆乌鲁木齐网站建设-乌鲁木齐网站制作设计-新疆远璨网络 | 济南拼接屏_山东液晶拼接屏_济南LED显示屏—维康国际官网 | 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 |