PHP程序設(shè)計(jì)項(xiàng)目化教程課件 項(xiàng)目8 購(gòu)物車系統(tǒng)-面向?qū)ο蟪绦蛟O(shè)計(jì)_第1頁(yè)
PHP程序設(shè)計(jì)項(xiàng)目化教程課件 項(xiàng)目8 購(gòu)物車系統(tǒng)-面向?qū)ο蟪绦蛟O(shè)計(jì)_第2頁(yè)
PHP程序設(shè)計(jì)項(xiàng)目化教程課件 項(xiàng)目8 購(gòu)物車系統(tǒng)-面向?qū)ο蟪绦蛟O(shè)計(jì)_第3頁(yè)
PHP程序設(shè)計(jì)項(xiàng)目化教程課件 項(xiàng)目8 購(gòu)物車系統(tǒng)-面向?qū)ο蟪绦蛟O(shè)計(jì)_第4頁(yè)
PHP程序設(shè)計(jì)項(xiàng)目化教程課件 項(xiàng)目8 購(gòu)物車系統(tǒng)-面向?qū)ο蟪绦蛟O(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

購(gòu)物車系統(tǒng)

——面向?qū)ο蟪绦蛟O(shè)計(jì)

項(xiàng)目8張華同學(xué)觀察到購(gòu)買學(xué)習(xí)資料和生活用品流程煩瑣、等待時(shí)間長(zhǎng),他提出了開(kāi)發(fā)一個(gè)便捷校園購(gòu)物系統(tǒng)的想?法。為提高系統(tǒng)運(yùn)營(yíng)效率,尤其是庫(kù)存和銷售管理,張華選擇利用面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)來(lái)構(gòu)建一個(gè)模塊化、可擴(kuò)展且易維護(hù)的購(gòu)物車系統(tǒng)。此系統(tǒng)旨在讓用戶輕松添加、刪除商品,并實(shí)時(shí)查看購(gòu)物車內(nèi)商品的總?價(jià)。通過(guò)這個(gè)系統(tǒng)的實(shí)現(xiàn),能夠?yàn)橥瑢W(xué)們帶來(lái)便捷的購(gòu)物體驗(yàn),節(jié)省時(shí)間,豐富校園生活。購(gòu)物車系統(tǒng)熟悉面向?qū)ο蟮乃枷?,了解面向過(guò)程和面向?qū)ο蟪绦蛟O(shè)計(jì)思想的差異;掌握類與對(duì)象的使用方法,包括類的定義和實(shí)例化方法、類成員的訪問(wèn)方法等;了解常見(jiàn)的魔術(shù)方法,掌握構(gòu)造方法和析構(gòu)方法的用法;掌握類常量和靜態(tài)成員的定義和訪問(wèn);了解面向?qū)ο蟮娜筇匦?,掌握封裝、繼承、多態(tài)的實(shí)現(xiàn)方法;掌握抽象類和接口的定義和實(shí)現(xiàn)。能夠編寫遵循面向?qū)ο笤瓌t的代碼:涵蓋類的設(shè)計(jì)、方法的實(shí)現(xiàn)以及對(duì)象的使用;能夠熟練運(yùn)用封裝、繼承、多態(tài)三大特性設(shè)計(jì)程序;能夠根據(jù)實(shí)際需求應(yīng)用抽象類和接口。培養(yǎng)良好的面向?qū)ο蟪绦蛟O(shè)計(jì)習(xí)慣,編寫出更加模塊化、可擴(kuò)展和易于維護(hù)的代碼;提高問(wèn)題解決能力,能夠運(yùn)用面向?qū)ο蟮姆椒ǚ治龊徒鉀Q復(fù)雜問(wèn)題;培養(yǎng)創(chuàng)新思維,能夠運(yùn)用面向?qū)ο笾R(shí)解決實(shí)際問(wèn)題,為軟件開(kāi)發(fā)和系統(tǒng)管理貢獻(xiàn)力量。面向?qū)ο箢惡蛯?duì)象魔術(shù)方法類常量和靜態(tài)成員面向?qū)ο蟮奶匦猿橄箢惡徒涌诿嫦驅(qū)ο驪ART01PHP是一種功能強(qiáng)大的混合型程序設(shè)計(jì)語(yǔ)言,它支持面向?qū)ο蟪绦蛟O(shè)計(jì)和面向過(guò)程程序設(shè)計(jì)兩種范式。對(duì)于簡(jiǎn)單的腳本和小型應(yīng)用,使用面向過(guò)程的程序設(shè)計(jì)范式可能更加直觀和高效。然而,在處理大型、復(fù)雜的項(xiàng)目時(shí),面向?qū)ο蟪绦蛟O(shè)計(jì)展現(xiàn)出了其獨(dú)特的優(yōu)?勢(shì)。8.1面向?qū)ο竺嫦蜻^(guò)程就是按照一系列步驟去解決問(wèn)題,這些步驟通常是按照特定的順序執(zhí)行函數(shù),以實(shí)現(xiàn)所需功能。面向?qū)ο蟪绦蛟O(shè)計(jì)采用了一種更符合人類思維方式的方法來(lái)解決問(wèn)題。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,我們分析問(wèn)題中的對(duì)象,并定義它們的特性(屬性)和行為(方法),對(duì)象之間通過(guò)信息傳遞進(jìn)行交互,共同完成任務(wù)。面向過(guò)程與面向?qū)ο笤谒季S方式上有著本質(zhì)的區(qū)別。在面向過(guò)程中,我們關(guān)注的是過(guò)程本身,扮演著執(zhí)行者的角色;而在面向?qū)ο笾?,我們更關(guān)注對(duì)象,扮演著指揮官的角?色。以日常生活中的洗衣服為例,面向過(guò)程的方法會(huì)關(guān)注洗衣的每一個(gè)具體步驟,面向?qū)ο蟮姆椒▌t更側(cè)重于洗衣機(jī)這個(gè)對(duì)象及其提供的功能。8.1.1面向過(guò)程和面向?qū)ο蟮膶?duì)比為了理解面向?qū)ο蟪绦蛟O(shè)計(jì)與面向過(guò)程程序設(shè)計(jì)兩種范式,可以將它們比作餐飲中的兩種不同制作方式:蓋澆飯和蛋炒飯。使用面向?qū)ο蟪绦蛟O(shè)計(jì)能夠更好地處理復(fù)雜問(wèn)題,提高代碼的可讀性、可維護(hù)性和可擴(kuò)展性。而面向過(guò)程程序設(shè)計(jì)更適合某些簡(jiǎn)單或性能敏感的場(chǎng)景。因此,在選擇程序設(shè)計(jì)方法時(shí),我們應(yīng)充分考慮問(wèn)題的特性和需求,以選擇最適合的設(shè)計(jì)方案。8.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)勢(shì)代碼重用性面向?qū)ο蟪绦蛟O(shè)計(jì)更像制作蓋澆飯。在這種范式下,問(wèn)題被分解為多個(gè)獨(dú)立的對(duì)象(如不同的菜品和米飯),每個(gè)對(duì)象負(fù)責(zé)處理自己的數(shù)據(jù)和行為。這些對(duì)象之間通過(guò)接口進(jìn)行通信,就像蓋澆飯中的菜品和米飯靈活組合在一起。這種設(shè)計(jì)方式不僅提高了代碼的可讀性和可維護(hù)性,還使得程序更加易于擴(kuò)展和重用。代碼重用性面向過(guò)程程序設(shè)計(jì)就像制作蛋炒飯,各種成分(如雞蛋、米飯、蔬菜等)緊密融合在一起,形成一個(gè)整體。在這種范式下,程序員詳細(xì)規(guī)劃每一步的操作順序。然而,當(dāng)問(wèn)題變得復(fù)雜,或者需要添加新的功能時(shí),這種方式可能會(huì)導(dǎo)致代碼變得難以維護(hù)和擴(kuò)展。面向?qū)ο蟪绦蛟O(shè)計(jì)的思維方式與我們的日常思維方式非常相似。比如,在描述一個(gè)人時(shí),我們會(huì)考慮其姓名、性別、年齡等特征,以及行為如駕駛和烹飪等。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,這些特征被稱作屬性,行為被稱作方法。簡(jiǎn)而言之,面向?qū)ο蟪绦蛟O(shè)計(jì)允許我們將現(xiàn)實(shí)世界的事物抽象成對(duì)象,并為這些對(duì)象賦予屬性和方法。8.1.3面向?qū)ο蟮暮诵母拍?.類的概念類是具有相同屬性和方法的一組對(duì)象的抽象描述??梢允褂枚x的類創(chuàng)建對(duì)象。在PHP中,通過(guò)類創(chuàng)建的對(duì)象稱為對(duì)象實(shí)例,而創(chuàng)建對(duì)象的過(guò)程就是類的實(shí)例化過(guò)程。類是一個(gè)抽象的概念,對(duì)象則是這個(gè)抽象概念的具體實(shí)例。2.對(duì)象的概念在面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)象是來(lái)自客觀世界的實(shí)體,如人類、書(shū)桌等。對(duì)象可分為靜態(tài)部分(屬性)和動(dòng)態(tài)部分(方法)。屬性是對(duì)象的靜態(tài)特征,如人的身高、體重等;方法是對(duì)象的行為,如人的行走、說(shuō)話等。在編程時(shí),我們首先將現(xiàn)實(shí)世界的實(shí)體抽象為對(duì)象,再定義其屬性和方法。8.1.3面向?qū)ο蟮暮诵母拍?.對(duì)象的屬性和方法對(duì)象包含兩個(gè)核心要素:屬性和方法。屬性是描述對(duì)象特征的變量,也稱為成員變量。方法是描述對(duì)象行為的函數(shù)。在PHP中,對(duì)象是屬性和方法的集合,方法表示對(duì)象的行為,而屬性表示對(duì)象的狀態(tài)。通過(guò)訪問(wèn)和設(shè)置屬性,以及調(diào)用方法,我們可以對(duì)對(duì)象進(jìn)行各種操?作。8.1.3面向?qū)ο蟮暮诵母拍铑惡蛯?duì)象PART02在PHP中,使用class關(guān)鍵字定義類。類的成員主要包含屬性(變量)和方法(函數(shù))。屬性用于描述對(duì)象的特征,例如人的姓名、年齡等。方法用于描述對(duì)象的行為,例如說(shuō)話、走路等。聲明類的語(yǔ)法格式如?下。說(shuō)明:類名:PHP的類名不區(qū)分大小寫,但為了保持代碼的一致性和可讀性,通常采用大駝峰命名法,即每個(gè)單詞的首字母大寫。例如,Student表示學(xué)生類。屬性列表:是多個(gè)屬性的聲明。方法列表:是多個(gè)方法的聲明。通常,屬性聲明放在方法聲明之前。類可以沒(méi)有任何成員,也可只有屬性或方?法。8.2.1類的定義class類名{

...//屬性列表

...//方法列表}Student類定義示例代碼。8.2.1類的定義//定義一個(gè)學(xué)生類classStudent{

//成員屬性

public$name="張華";

public$age=20;

//成員方法

publicfunctionshowInfo()

{

echo"ThisisStudentclass.";

}}PHP提供了3種訪問(wèn)控制修飾符來(lái)設(shè)定類成員的可見(jiàn)性:public(公有),protected(受保護(hù))和private(私有)。3種訪問(wèn)控制修飾符對(duì)應(yīng)的權(quán)限屬性如下表所示,其中,√表示允許訪問(wèn),×表示不允許訪?問(wèn)。說(shuō)明:

public:聲明公共的成員,在類的內(nèi)部和外部都可以訪問(wèn)。如果成員不顯式指定訪問(wèn)控制修飾符,則默認(rèn)為public。protected:聲明受保護(hù)類中的成員,只能在類的內(nèi)部和子類訪?問(wèn)。private:聲明私有的類中的成員,只能在類的內(nèi)部訪問(wèn),不能被繼?承。8.2.2訪問(wèn)控制修飾符PHP類成員定義的示例代碼如?下。8.2.2訪問(wèn)控制修飾符classStudent{

public$id=1; //公共的成員屬性,不受訪問(wèn)限制

protected$name="張三"; //受保護(hù)的成員屬性,能在類內(nèi)和子類中訪問(wèn)

private$age=20; //私有的成員屬性,僅能在類內(nèi)訪問(wèn)

publicfunctionshowInfo() //公共的成員方法

{

echo"Thisispublicmethod.";

}

privatefunctionprivateInfo() //私有的成員方法

{

echo"Thisisprivatemethod.";

}}在PHP中定義一個(gè)類之后,若要使用類的方法或?qū)傩?,需要先?shí)例化一個(gè)類,這個(gè)實(shí)例便是類中的對(duì)象。PHP中使用new關(guān)鍵字創(chuàng)建對(duì)象,實(shí)例化類的基本語(yǔ)法格式如?下。

說(shuō)明:$對(duì)象名:表示要?jiǎng)?chuàng)建的新實(shí)例的變量名,通過(guò)這個(gè)實(shí)例可以訪問(wèn)類中的成員。變量名要遵循PHP中變量的命名規(guī)范,盡量做到見(jiàn)名知?義。new:表示創(chuàng)建一個(gè)新的對(duì)?象。類名:表示要實(shí)例化的類的名稱。類名后面括號(hào)包含的是可選參數(shù)的列表,用于初始化類的成員屬性。如果在實(shí)例化類時(shí),不需要傳遞參數(shù),則可以省略類名后面的括?號(hào)。8.2.3類的實(shí)例化$對(duì)象名=new類名([參數(shù)1,參數(shù)2,…]);例如,實(shí)現(xiàn)在8.2.1節(jié)定義的Student類的基礎(chǔ)上創(chuàng)建兩個(gè)學(xué)生對(duì)象并輸出的代碼如下。運(yùn)行結(jié)果如下圖所示。8.2.3類的實(shí)例化$stu1=newStudent();//實(shí)例化Student類,創(chuàng)建學(xué)生對(duì)象$stu1$stu2=newStudent();//實(shí)例化Student類,創(chuàng)建學(xué)生對(duì)象$stu2echo"<pre>";print_r($stu1);print_r($stu2);echo"</pre>";實(shí)例化一個(gè)類后,可使用對(duì)象訪問(wèn)符->訪問(wèn)對(duì)象實(shí)例的屬性或方法,具體的語(yǔ)法格式如?下。在對(duì)象方法執(zhí)行時(shí)會(huì)自動(dòng)定義一個(gè)$this特殊變量,表示對(duì)當(dāng)前對(duì)象的引用。通過(guò)$this->的形式可引用當(dāng)前對(duì)象的方法和屬性,其作用是完成對(duì)象內(nèi)部成員之間的訪問(wèn)。$this只能在類定義的方法中使用,不能在類定義的外部使?用。8.2.4訪問(wèn)類的成員對(duì)象名->屬性名; 對(duì)象名->方法名;類外部訪問(wèn)類的成員示例。8.2.4訪問(wèn)類的成員classStudent{public$name;publicfunctionsayHello(){return"你好!我是".$this->name;}}$stu1=newStudent(); //實(shí)例化對(duì)象$stu1->name="張陽(yáng)"; //直接訪問(wèn)對(duì)象$stu1的name屬性echo$stu1->sayHello(); //調(diào)用對(duì)象$stu1的sayHello()方法在學(xué)習(xí)編程時(shí),有時(shí)會(huì)在類的成員方法中直接使用echo語(yǔ)句來(lái)輸出文本,這樣便于理解代碼的運(yùn)行結(jié)果。但在真正的項(xiàng)目開(kāi)發(fā)中,更傾向于使用return語(yǔ)句來(lái)輸出數(shù)據(jù)。1.提高可重用性當(dāng)使用return語(yǔ)句時(shí),方法可以返回一個(gè)具體的值。這個(gè)值既可以被直接賦給某個(gè)變量,也可以在其他地方使用。相比之下,echo語(yǔ)句只是簡(jiǎn)單地輸出數(shù)據(jù)到瀏覽器。2.便于測(cè)試和調(diào)試使用return語(yǔ)句返回的值可以很方便地用于測(cè)試和調(diào)試。3.代碼更清晰通常建議將業(yè)務(wù)邏輯(如計(jì)算、數(shù)據(jù)處理)與表示邏輯(如數(shù)據(jù)顯示)分開(kāi)。使用return語(yǔ)句就能很好地實(shí)現(xiàn)這一點(diǎn)。4.用途更廣泛return語(yǔ)句返回的值不僅用于輸出,它還有用于條件判斷、保存到數(shù)據(jù)庫(kù)或發(fā)送給客戶端等多種用?途。為何在類方法中使用return語(yǔ)句而非echo語(yǔ)句【案例實(shí)踐8-1】類的實(shí)例化及類成員的訪問(wèn)定義Student

類,實(shí)例化它并訪問(wèn)其成員。【案例實(shí)踐8-1】類的實(shí)例化及類成員的訪問(wèn)運(yùn)行結(jié)果如下圖所?示。在PHP中,對(duì)象的比較方式與基本數(shù)據(jù)類型不同。當(dāng)需要比較兩個(gè)對(duì)象是否相等時(shí),可以采用同一性比較或值比較兩種方?式。(1)同一性比較(===

!==)使用===和!==比較操作符時(shí),比較的是兩個(gè)變量是否為同一個(gè)實(shí)例,即它們是否引用同一個(gè)對(duì)?象。(2)值比較(==

!=)使用==和!=比較操作符時(shí),PHP會(huì)嘗試進(jìn)行值的比較。如果兩個(gè)對(duì)象是同一個(gè)類的實(shí)例,且兩個(gè)對(duì)象的屬性和屬性值相同,那么它們?cè)谥瞪媳徽J(rèn)為是相等?的。如果需要確認(rèn)兩個(gè)變量是否確實(shí)指向同一個(gè)對(duì)象,應(yīng)使用同一性比較;如果只關(guān)心兩個(gè)對(duì)象的內(nèi)容是否一致,可使用值比較。8.2.5對(duì)象的比較對(duì)象的比較示例。8.2.5對(duì)象的比較在PHP中,還可以使用instanceof關(guān)鍵字檢查一個(gè)對(duì)象是否為某個(gè)類的實(shí)例,返回布爾值。instanceof關(guān)鍵字左邊的變量表示對(duì)象,右邊的變量表示類名。如果對(duì)象是指定類或其子類的實(shí)例,則返回true,否則返回false。8.2.5對(duì)象的比較var_dump($stu1instanceofStudent);//輸出bool(true),因?yàn)?stu1是Student類的實(shí)例var_dump($stu1instanceofTest);//輸出bool(false),因?yàn)?stu1不是Test類的實(shí)例魔術(shù)方法PART03在PHP中,魔術(shù)方法是一組特殊的類方法,指那些以兩條下畫線(__)開(kāi)頭預(yù)定義的方法。這些方法會(huì)在PHP腳本運(yùn)行期間的不同時(shí)刻被自動(dòng)調(diào)用,不需手動(dòng)調(diào)?用。8.3魔術(shù)方法魔術(shù)方法可以讓開(kāi)發(fā)者實(shí)現(xiàn)各種高級(jí)功能,如屬性重載、方法重載、對(duì)象序列化、自定義對(duì)象字符串表達(dá)方式等。常見(jiàn)的魔術(shù)方法如下表所?示。8.3.1常見(jiàn)的魔術(shù)方法每個(gè)類中都有一個(gè)構(gòu)造方法,它在創(chuàng)建類的實(shí)例時(shí)自動(dòng)調(diào)用,也就是使用new關(guān)鍵字來(lái)實(shí)例化對(duì)象時(shí)自動(dòng)調(diào)用,常用于對(duì)象屬性的初始化賦值或者執(zhí)行一些必要的初始化操作。構(gòu)造方法被命名為_(kāi)_construct(),其語(yǔ)法格式如下。上述語(yǔ)法格式中,訪問(wèn)控制修飾符可以省略,默認(rèn)值為public。8.3.2構(gòu)造方法[訪問(wèn)控制修飾符]function__construct([參數(shù)列表]){//初始化操作}構(gòu)造方法示例。8.3.2構(gòu)造方法如果類中沒(méi)有顯式定義構(gòu)造方法,PHP會(huì)隱式地創(chuàng)建一個(gè)默認(rèn)的構(gòu)造方法。這個(gè)默認(rèn)的構(gòu)造方法不接收任何參數(shù),也不執(zhí)行任何操作,其形式大致如下。無(wú)顯式定義構(gòu)造方法的類示例。8.3.2構(gòu)造方法publicfunction__construct(){//無(wú)操作}與構(gòu)造方法對(duì)應(yīng)的是析構(gòu)方法,析構(gòu)方法在對(duì)象被銷毀之前自動(dòng)調(diào)用。析構(gòu)方法通常用于在對(duì)象銷毀前執(zhí)行一些清理操作,比如關(guān)閉文件句柄、釋放資源或者執(zhí)行一些需要在對(duì)象銷毀時(shí)完成的特殊操作。析構(gòu)方法被命名為_(kāi)_destruct(),且不接收任何參數(shù)。8.3.3析構(gòu)方法[訪問(wèn)控制修飾符]function__destruct(){//清理操作}使用析構(gòu)方法示例。8.3.3析構(gòu)方法本案例實(shí)踐實(shí)現(xiàn)了一個(gè)Person類,該類通過(guò)構(gòu)造方法對(duì)屬性進(jìn)行初始化賦值,通過(guò)析構(gòu)方法執(zhí)行清理操作?!景咐龑?shí)踐8-2】構(gòu)造方法和析構(gòu)方法的應(yīng)用類常量和靜態(tài)成員PART04在PHP中,類不僅可以定義普通的屬性和方法,還可以包含類常量和靜態(tài)成員。類常量是固定不變的值,而靜態(tài)成員屬于類本身,不屬于任何一個(gè)類的實(shí)例,這兩者都可以被類的所有實(shí)例共?享。8.4類常量和靜態(tài)成員類常量是在類中定義且值不會(huì)改變的常量。定義后,它在類的所有對(duì)象中都是相同的。類常量使用const關(guān)鍵字聲明,并使用類名直接訪問(wèn),基本語(yǔ)法格式如下。類常量的命名規(guī)范與普通常量的一致,通常以大寫字母表示類常量名。類常量可以通過(guò)類名直接訪問(wèn),即在類的內(nèi)部或外部通過(guò)“類名::類常量名”的方式進(jìn)行訪問(wèn)。::稱為范圍解析操作符,又稱雙冒?號(hào)。8.4.1類常量const類常量名='常量值';示例:定義一個(gè)包含類常量的Circle類,并計(jì)算圓的周長(zhǎng)和面積。8.4.1類常量除了類常量,靜態(tài)成員在類的所有實(shí)例之間共享,可以通過(guò)類名直接訪問(wèn),無(wú)須創(chuàng)建類的實(shí)例。靜態(tài)成員有兩種,分為靜態(tài)屬性和靜態(tài)方法。在PHP中,靜態(tài)成員使用static關(guān)鍵字定義。定義靜態(tài)成員的基本語(yǔ)法格式如下。訪問(wèn)靜態(tài)成員的基本語(yǔ)法格式如下。8.4.2靜態(tài)成員publicstatic屬性; //定義靜態(tài)屬性publicstatic方法(){}; //定義靜態(tài)方法類名::屬性名; //訪問(wèn)靜態(tài)屬性類名::方法名(); //調(diào)用靜態(tài)方法示例:靜態(tài)成員的用法。8.4.2靜態(tài)成員類常量:通常用于定義不會(huì)更改的常量,如數(shù)學(xué)常量、配置選項(xiàng)等。類常量是不可變的,因此非常適合用于需要保證一致性的場(chǎng)?合。靜態(tài)屬性:用于在類之間共享數(shù)據(jù),而不必通過(guò)實(shí)例化對(duì)象來(lái)訪問(wèn)。它們可以用于存儲(chǔ)類的狀態(tài)信息、緩存數(shù)據(jù)等。靜態(tài)屬性是可變的,因此可以用于需要?jiǎng)討B(tài)修改數(shù)據(jù)的場(chǎng)?合。類常量和靜態(tài)屬性的應(yīng)用場(chǎng)景在PHP的類中,self

關(guān)鍵字是一個(gè)特殊的類引用,它用于引用當(dāng)前類本身,而不是類的實(shí)例。self關(guān)鍵字用于在類的內(nèi)部引用當(dāng)前類的類常量、靜態(tài)屬性和靜態(tài)方法,不能在類的外部使?用。在PHP的類中,以static關(guān)鍵字聲明的屬性為靜態(tài)屬性,以static關(guān)鍵字聲明的方法為靜態(tài)方法,使用范圍解析運(yùn)算符::來(lái)訪問(wèn)類中的靜態(tài)屬性和靜態(tài)方?法。在類內(nèi),對(duì)靜態(tài)方法或靜態(tài)屬性的訪問(wèn)建議用self,不要用$this->的形式。對(duì)非靜態(tài)方法或?qū)傩缘脑L問(wèn)不能用self,只能用$this->。self和static關(guān)鍵字面向?qū)ο蟮奶匦訮ART05面向?qū)ο蟪绦蛟O(shè)計(jì)有三大核心特性,即封裝、繼承和多態(tài),它們共同為開(kāi)發(fā)者提供了一種更加靈活、可維護(hù)和可擴(kuò)展的編程方式。8.5面向?qū)ο蟮奶匦苑庋b是面向?qū)ο蟪绦蛟O(shè)計(jì)中的一個(gè)關(guān)鍵概念。在編程中,當(dāng)需要保護(hù)某些數(shù)據(jù)不被外部隨意訪問(wèn)或修改時(shí),就需要用到封?裝。在編程中,封裝是指將數(shù)據(jù)(屬性)和操作這些數(shù)據(jù)的方法緊密地結(jié)合在一起。這樣做的好處是可以隱藏?cái)?shù)據(jù)的具體實(shí)現(xiàn)細(xì)節(jié),只通過(guò)特定的方法來(lái)訪問(wèn)或修改這些數(shù)據(jù)。在PHP中,我們可以通過(guò)設(shè)置屬性的訪問(wèn)權(quán)限來(lái)實(shí)現(xiàn)封裝,即將屬性設(shè)置為private或protected,這樣它們就不能被類的外部直接訪問(wèn)。對(duì)于private或者protected權(quán)限的屬性,PHP提供了以下3種訪問(wèn)方式。8.5.1

封裝1.使用公共方法訪問(wèn)私有成員在類中,可以使用private來(lái)封裝屬性,這意味著這些屬性只能在對(duì)象內(nèi)部被訪問(wèn)。為了從外部訪問(wèn)這些私有屬性,我們可以在類中定義公共方?法。類的封裝示例。8.5.1

封裝2.利用魔術(shù)方法訪問(wèn)私有屬性PHP提供了一些特殊的魔術(shù)方法,如__set($name,$value)和__get($name),它們?cè)试S在讀取或?qū)懭氩豢稍L問(wèn)屬性時(shí)被調(diào)用,這為訪問(wèn)和修改類內(nèi)部的封裝屬性提供了靈活?性。示例:使用__set()和__get()魔術(shù)方法來(lái)訪問(wèn)Employee類私有屬性$salary。8.5.1

封裝3.使用魔術(shù)方法訪問(wèn)未定義成員除__get()和__set()之外,PHP還提供了__call($name,$arguments)魔術(shù)方法,它會(huì)在調(diào)用對(duì)象中不存在的方法時(shí)被自動(dòng)調(diào)用。8.5.1

封裝在面向?qū)ο蟪绦蛟O(shè)計(jì)中,繼承描述的是類和類之間的一種關(guān)系,它允許一個(gè)類(子類)繼承另一個(gè)類(父類)的屬性和方法,這就像在現(xiàn)實(shí)世界中,孩子會(huì)繼承父母的一些特征和行為一?樣。通過(guò)繼承,子類可以在不改變父類的基礎(chǔ)上進(jìn)行擴(kuò)展,添加新的功能或特性。這種機(jī)制能夠重用代碼,減少代碼重復(fù)編寫。以運(yùn)動(dòng)項(xiàng)目為例。假設(shè)有一個(gè)“運(yùn)動(dòng)”類,包含一些通用的屬性和方法。然后,可以創(chuàng)建“球”和“田徑”類作為“運(yùn)動(dòng)”類的子類。進(jìn)一步,“籃球”和“足球”類又可以作為“球”的子類,“短跑”和“長(zhǎng)跑”類則可以作為“田徑”類的子類,這樣就形成了一個(gè)清晰的運(yùn)動(dòng)項(xiàng)目繼承體系,如下圖所?示。8.5.2繼承PHP使用extends關(guān)鍵字實(shí)現(xiàn)子類與父類之間的繼承,其基本語(yǔ)法格式如下。PHP中的類只允許單繼承,即一個(gè)類只能直接從一個(gè)類繼承。例如,“球”繼承“運(yùn)動(dòng)”,“籃球”繼承“球”,但是“籃球”不能同時(shí)繼承“球”和“運(yùn)動(dòng)”。8.5.2繼承class子類名extends父類名{//子類的內(nèi)容定義}示例:使用繼承創(chuàng)建一個(gè)Ball類,它從Sport類繼承。8.5.2繼承在PHP中,可使用parent關(guān)鍵字調(diào)用父類的內(nèi)容。使用parent關(guān)鍵字可調(diào)用的父類的內(nèi)容包括:類常量、靜態(tài)屬性、靜態(tài)方法、成員屬性、成員方法等。使用parent關(guān)鍵字的語(yǔ)法格式如下。認(rèn)識(shí)parent關(guān)鍵字parent::父類常量名; //調(diào)用父類類常量parent::父類屬性名; //調(diào)用父類靜態(tài)屬性或成員屬性parent::父類方法名(); //調(diào)用父類靜態(tài)方法或成員方法父類ParentClass有一個(gè)方法method()。當(dāng)創(chuàng)建了一個(gè)子類ChildClass,并在個(gè)子類中調(diào)用父類的method()方法,可使用parent關(guān)鍵字。認(rèn)識(shí)parent關(guān)鍵字classParentClass{publicfunctionmethod(){echo'這是父類定義的方法。';}}classChildClassextendsParentClass{publicfunctioncallMethod(){parent::method(); //在子類中調(diào)用父類的成員方法}}$obj=newChildClass();$obj->callMethod(); //輸出“這是父類定義的方法?!痹赑HP中,當(dāng)需要在繼承的過(guò)程中保證某些類或方法不被改變,需使用final關(guān)鍵字將類定義成最終類,或?qū)⒎椒ǘx成最終方法。使用final關(guān)鍵字定義的類不能被繼承,只能被實(shí)例化;使用final關(guān)鍵字定義的方法不能重?寫。使用final關(guān)鍵字的語(yǔ)法格式如?下。認(rèn)識(shí)final關(guān)鍵字finalclass類名 //最終類{[訪問(wèn)控制修飾符]finalfunction方法名(){} //最終方法}使用final關(guān)鍵字定義類的示例代碼如?下。認(rèn)識(shí)final關(guān)鍵字finalclassPerson{//類的實(shí)現(xiàn)//這個(gè)類不能被繼承}//下面的代碼會(huì)導(dǎo)致錯(cuò)誤,因?yàn)镻erson類被聲明為finalclassStudentextendsPerson{}classAnotherClass{publicfinalfunctionfinalMethod(){echo"這個(gè)方法不能被重寫。";}}classChildClassextendsAnotherClass{//導(dǎo)致錯(cuò)誤,因?yàn)閒inalMethod()被聲明為finalpublicfunctionfinalMethod(){}//錯(cuò)誤:不能重寫最終方法AnotherClass::finalMethod()}多態(tài)是指在同一個(gè)操作域操作不同的對(duì)象,會(huì)產(chǎn)生不同的執(zhí)行結(jié)果。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,多態(tài)的實(shí)現(xiàn)離不開(kāi)繼承,當(dāng)多個(gè)對(duì)象繼承了同一個(gè)對(duì)象后,就獲得了相同的方法,然后可以根據(jù)每個(gè)對(duì)象的需求來(lái)改變同名方法的執(zhí)行結(jié)?果。在PHP中,多態(tài)可以通過(guò)繼承和接口來(lái)實(shí)現(xiàn)(接口在后文講解)。當(dāng)一個(gè)類繼承自另一個(gè)類時(shí),它可以添加新的功能或者覆蓋(重寫)父類的方法,這樣,一個(gè)父類(如Person類)可以被多個(gè)子類(如Student類)繼承,每個(gè)子類都可以有自己的行為,同時(shí)共享父類的特?性。8.5.3多態(tài)比如,存在父類“人”類,它可以被“學(xué)生”類繼承。雖然“人”類和“學(xué)生”類都有“介紹自己”這個(gè)功能,但介紹的內(nèi)容會(huì)有所不同,這就是多態(tài)的體現(xiàn)。8.5.3多態(tài)【案例實(shí)踐8-3】實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)員參賽得獎(jiǎng)統(tǒng)計(jì)實(shí)現(xiàn)個(gè)人運(yùn)動(dòng)員和團(tuán)隊(duì)運(yùn)動(dòng)員的參賽和得獎(jiǎng)統(tǒng)計(jì)。不同類型的運(yùn)動(dòng)員的比賽方式和統(tǒng)計(jì)結(jié)果有所不?同。首先,定義運(yùn)動(dòng)員父類Athlete?!景咐龑?shí)踐8-3】實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)員參賽得獎(jiǎng)統(tǒng)計(jì)然后,定義個(gè)人運(yùn)動(dòng)員子類IndAthlete和團(tuán)隊(duì)運(yùn)動(dòng)員子類TeamAthlete。【案例實(shí)踐8-3】實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)員參賽得獎(jiǎng)統(tǒng)計(jì)最后,實(shí)例化IndAthlete類和TeamAthlete類,創(chuàng)建個(gè)人運(yùn)動(dòng)員對(duì)象和團(tuán)隊(duì)運(yùn)動(dòng)員對(duì)象,調(diào)用相應(yīng)參賽方法等?!景咐龑?shí)踐8-3】實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)員參賽得獎(jiǎng)統(tǒng)計(jì)運(yùn)行結(jié)果如下圖所?示。抽象類和接口PART06抽象類和接口是面向?qū)ο蟪绦蛟O(shè)計(jì)中用于實(shí)現(xiàn)抽象化的重要概念,它們的存在分別解決了代碼復(fù)用與多態(tài)性實(shí)現(xiàn)的問(wèn)題,適用于不同的程序設(shè)計(jì)場(chǎng)?景。8.6抽象類和接口抽象類是不能被實(shí)例化的類,只能作為其他類的父類。抽象類的作用是為子類提供一個(gè)共同的接口和部分實(shí)現(xiàn)。抽象類可以包含抽象方法(沒(méi)有具體實(shí)現(xiàn)的方法)、非抽象方法(有具體實(shí)現(xiàn)的方法)、屬性和常?量。以abstract關(guān)鍵字聲明的類稱為抽象類。以abstract關(guān)鍵字聲明的方法稱為抽象方法。任何一個(gè)類,只要有一個(gè)方法被聲明為抽象方法,這個(gè)類就必須被聲明為抽象類。抽象方法只是聲明了其調(diào)用方式(參數(shù)),具體實(shí)現(xiàn)需要子類來(lái)完成。8.6.1抽象類abstractclass類名 //定義抽象類{

publicabstractfunction方法名(); //定義抽象方法}繼承一個(gè)抽象類時(shí),子類必須實(shí)現(xiàn)父類中的所有抽象方法;另外,這些方法的訪問(wèn)控制修飾符必須和抽象父類中的一樣(或者訪問(wèn)權(quán)限更寬松)。例如,某個(gè)抽象方法被聲明為受保護(hù)的,子類中實(shí)現(xiàn)的方法就應(yīng)該聲明為受保護(hù)的或者公有的,而不能聲明為私有的。此外,方法的調(diào)用方式必須匹配,即類型和強(qiáng)制參數(shù)數(shù)量必須一?致。抽象類應(yīng)用示例。8.6.1抽象類如果一個(gè)抽象類中的所有方法都是抽象的,那么可以將其定義為接口。接口通常用于定義一組公共的方法,而不關(guān)心這些方法的具體實(shí)現(xiàn)過(guò)程。這使得接口可以被不同的類實(shí)現(xiàn),從而實(shí)現(xiàn)多?態(tài)。接口是用interface關(guān)鍵字定義的類,可以指定必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容,并且所有方法都必須是公有的;可以定義常量,其和類常量的用法完全相同,但是在PHP8.1之前不能被子類或子接口所覆蓋;可以定義魔術(shù)方法,以便要求類實(shí)現(xiàn)這些方法。定義接口的語(yǔ)法格式如下。8.6.2接口interface接口名 //定義接口{

publicfunction方法名(); //定義公共方法}一個(gè)類可以實(shí)現(xiàn)一個(gè)或多個(gè)接口??墒褂胕mplements關(guān)鍵字實(shí)現(xiàn)接口。類中必須實(shí)現(xiàn)接口中定義的所有方法,否則會(huì)出現(xiàn)嚴(yán)重錯(cuò)誤。類可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)分隔多個(gè)接口的名稱即?可。8.6.2接口class類名implements接口名 {類的內(nèi)容定義 //必須實(shí)現(xiàn)接口中定義的方法}接口應(yīng)用示例。8.6.2接口【案例實(shí)踐8-4】實(shí)現(xiàn)常見(jiàn)交通工具的應(yīng)用汽車和飛機(jī)作為交通工具,都需要具備燃料續(xù)航的功能。因此可以通過(guò)抽象類和接口提煉共同的屬性、必需的方法,再通過(guò)子類繼承抽象類各自的不同功能,實(shí)現(xiàn)接口和必需的方?法。首先,使用Vehicle抽象類來(lái)定義所有交通工具共有的屬性和方法?!景咐龑?shí)踐8-4】實(shí)現(xiàn)常見(jiàn)交通工具的應(yīng)用定義一個(gè)Refuelable接口來(lái)表示具有加油能力的交通工具,包含抽象方法refuel()。代碼如下。//Refuelable接口interfaceRefuelable{publicfunctionrefuel($fuelAmount);}【案例實(shí)踐8-4】實(shí)現(xiàn)常見(jiàn)交通工具的應(yīng)用定義Car子類和Plane子類,它們都繼承Vehicle類并實(shí)現(xiàn)Refuelable接口,各自包含特有的屬性和方法?!景咐龑?shí)踐8-4】實(shí)現(xiàn)常見(jiàn)交通工具的應(yīng)用實(shí)例化Car子類和Plane子類,創(chuàng)建Car對(duì)象和Plane對(duì)象,調(diào)用各自的方法。為實(shí)現(xiàn)購(gòu)物車系統(tǒng),需要確定購(gòu)物車系統(tǒng)的功能需求:用戶能夠添加商品到購(gòu)物車、刪除購(gòu)物車中的商品、查看購(gòu)物車中的商品列表、修改購(gòu)物車中商品的數(shù)量、計(jì)算購(gòu)物車中商品的總價(jià)、清空購(gòu)物車?等。首先,利用面向?qū)ο蟮姆庋b、繼承、多態(tài)的思想,設(shè)計(jì)商品類(Product)及其子類食品類(Food)和電子產(chǎn)品類(Electronics類);設(shè)計(jì)購(gòu)物車類(Cart),用于管理購(gòu)物車中的商品項(xiàng),如下圖圖所?示。然后,設(shè)計(jì)購(gòu)物車前端界面,用于展示商品列表、購(gòu)物車內(nèi)容等;設(shè)計(jì)后端邏輯,處理購(gòu)物車操作并使用Session來(lái)存儲(chǔ)購(gòu)物車數(shù)?據(jù)。最后,構(gòu)建出一個(gè)穩(wěn)定、安全的購(gòu)物車系統(tǒng),保證其具備良好的性能,較高的安全性、可維護(hù)性和擴(kuò)展?性。任務(wù)8-1定

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論