PHP網(wǎng)站開(kāi)發(fā)項(xiàng)目式教程(微課版)(第2版)任務(wù)12 使用PHP面向?qū)ο蟪绦蛟O(shè)計(jì)方法_第1頁(yè)
PHP網(wǎng)站開(kāi)發(fā)項(xiàng)目式教程(微課版)(第2版)任務(wù)12 使用PHP面向?qū)ο蟪绦蛟O(shè)計(jì)方法_第2頁(yè)
PHP網(wǎng)站開(kāi)發(fā)項(xiàng)目式教程(微課版)(第2版)任務(wù)12 使用PHP面向?qū)ο蟪绦蛟O(shè)計(jì)方法_第3頁(yè)
PHP網(wǎng)站開(kāi)發(fā)項(xiàng)目式教程(微課版)(第2版)任務(wù)12 使用PHP面向?qū)ο蟪绦蛟O(shè)計(jì)方法_第4頁(yè)
PHP網(wǎng)站開(kāi)發(fā)項(xiàng)目式教程(微課版)(第2版)任務(wù)12 使用PHP面向?qū)ο蟪绦蛟O(shè)計(jì)方法_第5頁(yè)
已閱讀5頁(yè),還剩31頁(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)介

單擊此處添加副標(biāo)題PHP網(wǎng)站開(kāi)發(fā)項(xiàng)目式教程(微課版)(第2版)任務(wù)12

使用PHP面向?qū)ο蟪绦蛟O(shè)計(jì)方法任務(wù)12-1理解面向?qū)ο?/p>

需要解決的核心問(wèn)題面向?qū)ο蟮幕咎卣饔心男克鼈兏髯缘暮x是什么?

PHP是同時(shí)支持面向過(guò)程和面向?qū)ο蟮木幊陶Z(yǔ)言。PHP開(kāi)發(fā)者可以在面向過(guò)程和面向?qū)ο髢煞N方式中自由選擇其一或是混合使用。面向過(guò)程開(kāi)發(fā)周期短、發(fā)布速度快、效率較高;面向?qū)ο箝_(kāi)發(fā)周期長(zhǎng)、效率較低,但易于維護(hù)、改進(jìn)、擴(kuò)展和開(kāi)發(fā)API(ApplicationProgrammingInterface,應(yīng)用編程接口)。在PHP開(kāi)發(fā)中,很難說(shuō)哪一種方式更優(yōu)異,應(yīng)盡量在開(kāi)發(fā)過(guò)程中發(fā)揮出兩種編程方式各自的優(yōu)勢(shì)。12.1.1面向?qū)ο蟪绦蛟O(shè)計(jì)概念

在面向?qū)ο蟮恼Z(yǔ)言中,除了事物的內(nèi)部狀態(tài)數(shù)據(jù)需要使用類進(jìn)行封裝之外,在類中往往還需要提供兩種方法,一種是操作這些狀態(tài)數(shù)據(jù)的方法,另一種是為實(shí)現(xiàn)這類事物的行為特征而定義的方法,這些方法使用函數(shù)來(lái)實(shí)現(xiàn)。

即在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,開(kāi)發(fā)者希望直接對(duì)客觀世界進(jìn)行模擬:定義一個(gè)類,對(duì)應(yīng)客觀世界的某種事物;實(shí)際業(yè)務(wù)中需要關(guān)心這個(gè)事物的哪些狀態(tài),程序就為這些狀態(tài)定義屬性;實(shí)際業(yè)務(wù)中需要關(guān)心這個(gè)事物的哪些行為,程序就為這些行為定義方法函數(shù)。12.1.2面向?qū)ο蟮幕咎卣?/p>

面向?qū)ο蟮姆绞接?個(gè)基本特征:封裝(Encapsulation)、繼承(Inheritance)和多態(tài)(Polymorphism)。

封裝指的是將對(duì)象的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),然后通過(guò)一些公用方法來(lái)展示該對(duì)象的功能,封裝是通過(guò)類來(lái)實(shí)現(xiàn)的。

繼承是面向?qū)ο髮?shí)現(xiàn)軟件復(fù)用的重要手段,當(dāng)子類繼承父類后,子類將直接繼承父類的屬性和方法,除此之外,子類還可以修改或額外添加新的行為。

多態(tài)就是把子類對(duì)象賦值給父類引用,然后調(diào)用父類的方法去執(zhí)行子類覆蓋父類的方法。在PHP中,對(duì)象引用并不明確區(qū)分是父類引用還是子類引用。任務(wù)12-2使用類和對(duì)象

需要解決的核心問(wèn)題如何創(chuàng)建類?類的屬性和方法如何定義?如何對(duì)類進(jìn)行實(shí)例化?對(duì)類進(jìn)行訪問(wèn)控制時(shí),可以使用哪幾個(gè)關(guān)鍵字?它們各自的含義是什么?類的靜態(tài)屬性和方法如何定義?如何訪問(wèn)?

構(gòu)造函數(shù)和析構(gòu)函數(shù)的作用是什么?PHP5及之后的版本中,構(gòu)造函數(shù)和析構(gòu)函數(shù)的名稱分別是什么?如何實(shí)現(xiàn)類的繼承和重載?抽象類如何定義?如何使用?PHP中接口的概念是什么?魔術(shù)方法有哪幾個(gè)?它們各自的作用是什么?

面向?qū)ο蟮某绦蛟O(shè)計(jì)中有兩個(gè)重要概念——類(Class)和對(duì)象(Object),對(duì)象也被稱為實(shí)例(Instance)。其中類是對(duì)某一批對(duì)象的抽象描述,可以把類理解成某種概念;對(duì)象則是一個(gè)具體存在的實(shí)體。一個(gè)類的所有對(duì)象都具有相同的數(shù)據(jù)結(jié)構(gòu),并且共享相同的實(shí)現(xiàn)操作的代碼;各個(gè)對(duì)象又可以擁有各自不同的狀態(tài),即私有數(shù)據(jù)。12.2.1類的創(chuàng)建與實(shí)例化

類由變量和函數(shù)等組成,在類中,變量可稱為屬性,函數(shù)可稱為方法。1.定義類

PHP面向?qū)ο笾卸x類的簡(jiǎn)單語(yǔ)法如下。[修飾符]class類名{零到多個(gè)屬性零到多個(gè)方法}

每個(gè)類的定義都以關(guān)鍵字class開(kāi)頭,后面依次跟類名和一對(duì)花括號(hào),花括號(hào)中包含對(duì)類的屬性與方法的定義。

修飾符可以是public、final和abstract。public是默認(rèn)值,其對(duì)應(yīng)的類權(quán)限最大;final類不可被繼承;abstract類是一個(gè)抽象類,抽象類不能被實(shí)例化,但是使用extends關(guān)鍵字繼承抽象類之后得到的public類是可以被實(shí)例化的。

類名可以是任何非PHP保留字的合法標(biāo)簽。一個(gè)合法類名以字母或下畫線開(kāi)頭,后面跟若干字母、數(shù)字或下畫線。2.類的實(shí)例化與訪問(wèn)

在聲明一個(gè)類之后,該類只存在于文件中,程序不能直接調(diào)用它。需要對(duì)該類創(chuàng)建一個(gè)對(duì)象,在程序中才可以使用該類,創(chuàng)建一個(gè)類的對(duì)象的過(guò)程稱為類的實(shí)例化。類的實(shí)例化需要使用new關(guān)鍵字,關(guān)鍵字后面需要指定實(shí)例化的類名,格式如下。$obj=newclassname;12.2.2類的訪問(wèn)控制

類的訪問(wèn)控制是指對(duì)屬性或方法的訪問(wèn)控制,是通過(guò)在前面添加關(guān)鍵字public(公有的)、protected(受保護(hù)的)或private(私有的)來(lái)實(shí)現(xiàn)的。public:被定義為公有的類成員可以在類的外部或內(nèi)部被訪問(wèn)。protected:被定義為受保護(hù)的類成員可以被其自身及其子類和父類訪問(wèn)。

private:被定義為私有的類成員只能被其定義所在的類訪問(wèn),即私有成員將不會(huì)被繼承。

屬性必須定義為公有的、受保護(hù)的、私有的之一。如果用var定義,則被視為公有的,可以將var看作public關(guān)鍵字的別名形式。

在設(shè)計(jì)類時(shí),通常可將類的屬性設(shè)為私有的,而將大多數(shù)方法設(shè)為公有的。這樣,類以外的代碼不能直接訪問(wèn)類的私有數(shù)據(jù),從而實(shí)現(xiàn)了數(shù)據(jù)封裝;而公有的方法可為內(nèi)部的私有數(shù)據(jù)提供外部接口,但接口實(shí)現(xiàn)的細(xì)節(jié)在類的外面又是不可見(jiàn)的。12.2.3靜態(tài)的屬性和方法

在類中還可以定義靜態(tài)的屬性和方法,所謂“靜態(tài)”,是指所定義的屬性和方法與類的實(shí)例無(wú)關(guān),只與類本身有關(guān)。靜態(tài)的屬性和方法一般用來(lái)包含類要封裝的數(shù)據(jù)和功能,可以由所有類的實(shí)例共享。在類中可以使用static關(guān)鍵字定義靜態(tài)的屬性和方法。

訪問(wèn)靜態(tài)的屬性和方法時(shí),需要使用范圍解析符“::”,格式如下。classname::$attribute;//訪問(wèn)靜態(tài)屬性classname::Cfunction();//訪問(wèn)靜態(tài)方法12.2.4構(gòu)造函數(shù)和析構(gòu)函數(shù)

構(gòu)造函數(shù)是類中的一個(gè)特殊函數(shù),創(chuàng)建類的實(shí)例時(shí),構(gòu)造函數(shù)將被自動(dòng)調(diào)用,其主要功能是對(duì)類中的對(duì)象完成初始化操作。與構(gòu)造函數(shù)相對(duì)的是析構(gòu)函數(shù),析構(gòu)函數(shù)在類的對(duì)象被銷毀時(shí)自動(dòng)調(diào)用。1.構(gòu)造函數(shù)

PHP4中,在類的內(nèi)部與類同名的函數(shù)都被認(rèn)為是構(gòu)造函數(shù),該函數(shù)在創(chuàng)建類的對(duì)象時(shí)自動(dòng)執(zhí)行。PHP5以及之后的版本中,構(gòu)造函數(shù)用__construct()方法來(lái)聲明(注意,construct前面是兩條下畫線),這樣做的好處是可以使構(gòu)造函數(shù)名稱與類名區(qū)分開(kāi),當(dāng)類名發(fā)生改變時(shí),不需要修改相應(yīng)的構(gòu)造函數(shù)名稱。

在PHP5及之后的版本中,為了向下兼容,如果一個(gè)類中沒(méi)有名為_(kāi)_construct()的方法,則PHP將搜索一個(gè)與類名同名的方法作為構(gòu)造方法。如果__construct()方法和與類名同名的方法同時(shí)存在,則優(yōu)先將__construct()作為構(gòu)造方法。2.析構(gòu)函數(shù)

類的析構(gòu)函數(shù)是__destruct(),析構(gòu)函數(shù)不能使用參數(shù)。若在類中聲明了該函數(shù),則PHP將在對(duì)象被銷毀前調(diào)用該函數(shù),將對(duì)象從內(nèi)存中銷毀,節(jié)省服務(wù)器資源。

執(zhí)行結(jié)果如圖12-1所示。

將數(shù)字1作為實(shí)參創(chuàng)建對(duì)象$a時(shí),自動(dòng)執(zhí)行構(gòu)造函數(shù),輸出結(jié)果“執(zhí)行構(gòu)造函數(shù)1”;將數(shù)字2作為實(shí)參創(chuàng)建對(duì)象$b時(shí),自動(dòng)執(zhí)行構(gòu)造函數(shù),輸出結(jié)果“執(zhí)行構(gòu)造函數(shù)2”。對(duì)象$a和$b分別訪問(wèn)了類的函數(shù)res(),根據(jù)傳遞的實(shí)參計(jì)算并輸出結(jié)果。在所有內(nèi)容執(zhí)行完畢之后,分別訪問(wèn)對(duì)象$a和對(duì)象$b的析構(gòu)函數(shù)銷毀對(duì)象,并輸出“執(zhí)行析構(gòu)函數(shù)”。圖12-1

構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行結(jié)果12.2.5類的繼承1.子類訪問(wèn)父類

在PHP中,允許通過(guò)繼承其他類的方式來(lái)調(diào)用這些類中已經(jīng)定義的屬性和方法。PHP不支持多繼承,因此一個(gè)子類只能繼承一個(gè)父類。可以使用extends關(guān)鍵字指明類與類之間的繼承關(guān)系,格式如下。classSubclassextendsParclass{}

其中,Subclass表示子類,Parclass表示父類。2.重定義

方法的重載是指在一個(gè)類中可以定義多個(gè)同名的方法,通過(guò)參數(shù)個(gè)數(shù)和類型來(lái)區(qū)分這些方法。PHP并不支持這一特性,但可以通過(guò)類的繼承在子類中定義與父類中同名的方法來(lái)實(shí)現(xiàn)類似于方法重載的特性,即重定義。

子類中重定義父類中的屬性和方法,并不改變父類中的屬性和方法。3.關(guān)鍵字final

從PHP5開(kāi)始引入final關(guān)鍵字,在聲明類時(shí),若使用這個(gè)關(guān)鍵字,則該類將不能被繼承。另外,若是將關(guān)鍵字final用于聲明類中的方法,則該方法將不能在子類中重載。12.2.6抽象類和接口1.抽象類

抽象類是從PHP5開(kāi)始引入的新特性,它是一種特殊的類,使用關(guān)鍵字abstract定義,不能被實(shí)例化。一個(gè)抽象類中至少包含一個(gè)抽象方法,抽象方法也是由abstract關(guān)鍵字定義的。抽象方法只提供方法的聲明,不提供方法的具體實(shí)現(xiàn)。例如:abstractfunctionfunc($name,$num);

包含抽象方法的類必須是抽象類。

抽象類只能通過(guò)繼承來(lái)使用。繼承抽象類的子類必須重載抽象類中的所有抽象方法才能被實(shí)例化。2.接口

PHP只能進(jìn)行單繼承,即一個(gè)類只能有一個(gè)父類。當(dāng)一個(gè)類需要繼承多個(gè)類的功能時(shí),單繼承將無(wú)法實(shí)現(xiàn)。為了解決這個(gè)問(wèn)題,從PHP5開(kāi)始引入接口的概念。

接口是通過(guò)interface關(guān)鍵字而不是class關(guān)鍵字定義的,雖然像定義標(biāo)準(zhǔn)的類一樣,但其中定義的所有方法都是空的。

接口中定義的所有方法都必須是公有方法,這是接口的特性。另外,接口中不能使用屬性,但可以使用const關(guān)鍵字定義常量。

接口也支持繼承,接口之間的繼承也使用關(guān)鍵字extends來(lái)實(shí)現(xiàn)。

定義接口之后,可以將其實(shí)例化,接口的實(shí)例化稱為接口的實(shí)現(xiàn)。實(shí)現(xiàn)一個(gè)接口需要一個(gè)子類來(lái)實(shí)現(xiàn)接口中的所有抽象方法。定義接口的子類必須使用關(guān)鍵字implements。一個(gè)子類可以實(shí)現(xiàn)多個(gè)接口,通過(guò)這種形式可解決多繼承的問(wèn)題。12.2.7類的魔術(shù)方法

因?yàn)镻HP規(guī)定以雙下畫線“__”開(kāi)頭的方法都保留為“魔術(shù)方法”,所以在定義函數(shù)名時(shí)盡量不要使用“__”開(kāi)頭,除非是為了重載已有的魔術(shù)方法。前面介紹的構(gòu)造函數(shù)__construct()和析構(gòu)函數(shù)__destruct()都是魔術(shù)方法。除此之外,PHP還有另外幾個(gè)魔術(shù)方法。1.克隆對(duì)象

在PHP中可使用clone關(guān)鍵字建立與原對(duì)象擁有相同屬性和方法的對(duì)象,若需要改變這些屬性,則可以使用PHP提供的魔術(shù)方法__clone(),這個(gè)方法在“克隆”對(duì)象時(shí)會(huì)自動(dòng)調(diào)用。2.方法重載

魔術(shù)方法__call()可以用于實(shí)現(xiàn)方法的重載。使用該方法的格式如下。function__call(arg1,arg2){}

參數(shù)arg1,表示被調(diào)用的方法名稱。

參數(shù)arg2,表示傳遞給該方法的參數(shù)數(shù)組,當(dāng)對(duì)象訪問(wèn)類中不存在的方法時(shí),__call()方法將被調(diào)用。3.訪問(wèn)類的屬性

通常情況下為了實(shí)現(xiàn)類的封裝,會(huì)將類的屬性定義為private(私有的),此時(shí)從類的外部直接訪問(wèn)類的私有屬性是不允許的。在PHP中定義了兩個(gè)魔術(shù)方法__set()和__get(),在讀取不存在的屬性時(shí),會(huì)自動(dòng)調(diào)用方法__set()和__get()。

__set()方法需要兩個(gè)參數(shù),分別是將要設(shè)置的屬性名稱和取值;__get()方法只需要屬性名稱一個(gè)參數(shù),該方法會(huì)返回屬性的值。4.字符串轉(zhuǎn)換

由類創(chuàng)建的對(duì)象,其數(shù)據(jù)類型是對(duì)象,不能直接使用print或者echo語(yǔ)句輸出。在要輸出對(duì)象時(shí),可以在類中定義__toString()方法,在該方法中會(huì)返回可輸出的字符串。5.自動(dòng)加載對(duì)象

__autoload()方法用于自動(dòng)加載對(duì)象,它不是一個(gè)類方法,而是一個(gè)單獨(dú)的函數(shù)。如果腳本中定義了__autoload()函數(shù),則使用new關(guān)鍵字實(shí)例化沒(méi)有聲明的類時(shí),這個(gè)類的名稱將作為實(shí)參傳遞給__autoload()函數(shù),該函數(shù)會(huì)根據(jù)實(shí)參類名自動(dòng)確定類文件名,并加載類文件中的同名類。6.對(duì)象序列化

對(duì)象序列化是指將對(duì)象轉(zhuǎn)換成字節(jié)流的形式,并將序列化后的對(duì)象在文件或網(wǎng)絡(luò)中傳輸,然后將其反序列化還原為原數(shù)據(jù)。

對(duì)象序列化使用函數(shù)serialize()來(lái)實(shí)現(xiàn),反序列化使用函數(shù)unserialize()來(lái)實(shí)現(xiàn)。在進(jìn)行對(duì)象序列化時(shí),如果存在魔術(shù)方法__sleep(),則PHP會(huì)調(diào)用該方法,用于清除數(shù)據(jù)提交、關(guān)閉數(shù)據(jù)庫(kù)連接等,并返回一個(gè)數(shù)組,該數(shù)組包含需要序列化的所有變量。在反序列化對(duì)象后,PHP調(diào)用__wakeup()方法,用于重建對(duì)象序列化時(shí)丟失的資源。方法__sleep()和__wakeup()都不需要接收參數(shù)。12.2.8實(shí)例——使用類和對(duì)象的方式實(shí)現(xiàn)郵箱登錄功能1.創(chuàng)建數(shù)據(jù)庫(kù)操作類Database

創(chuàng)建文件db_class.php,在其中創(chuàng)建類Database,在類中定義下面的屬性。$conn,用于表示數(shù)據(jù)庫(kù)連接。$result,用于保存查詢結(jié)

溫馨提示

  • 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)論