




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、PHP面向?qū)ο笤斀獗静糠忠还舶ㄒ韵乱恍┘夹g(shù)點(diǎn):1 .面向?qū)ο蟮母拍? .什么是類,什么是對(duì)象,類和對(duì)象這間的關(guān)系3 .什么是面向?qū)ο缶幊棠兀? .如何抽象出一個(gè)類?5 .如何實(shí)例化對(duì)象?6 .如何去使用對(duì)象中的成員?7 .特殊的引用“$this的使用8 .構(gòu)造方法與析構(gòu)方法9 .封裝性10 .set(get()、isset(卜unset()四個(gè)方法的應(yīng)用11 .類的繼承12 .多態(tài)的應(yīng)用13 .重載新的方法14 .訪問(wèn)類型15 .靜態(tài)成員的使用16 .final關(guān)鍵字的應(yīng)用17 ._toString()方法18 .克隆對(duì)象19 .call處理調(diào)用錯(cuò)誤20 .自動(dòng)加載類21 .把對(duì)象串行化22
2、 .抽象方法和抽象類23 .php5接口技術(shù)1 .面向?qū)ο蟮母拍蠲嫦驅(qū)ο缶幊蹋∣bjectOrientedProgramming,OOP,面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu),OOP的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成,OOP達(dá)到了軟件工程的三個(gè)目標(biāo):重用性、靈活性和擴(kuò)展性。為了實(shí)現(xiàn)整體運(yùn)算,每個(gè)對(duì)象都能夠接收信息、處理數(shù)據(jù)和向其它對(duì)象發(fā)送信息。面向?qū)ο笠恢笔擒浖_(kāi)發(fā)領(lǐng)域內(nèi)比較熱門的話題,首先,面向?qū)ο蠓先祟惪创挛锏囊话阋?guī)律。其次,采用面向?qū)ο蠓椒梢允瓜到y(tǒng)各部分各司其職、各盡所能。為編程人員敞開(kāi)了一扇大門,使其編程的代碼更簡(jiǎn)潔、更易于維護(hù),并且具有更
3、強(qiáng)的可重用性。有人說(shuō)PHP不是一個(gè)真正的面向?qū)ο蟮恼Z(yǔ)言,這是事實(shí)。PHP是一個(gè)混合型語(yǔ)言,你可以使用OO巳也可以使用傳統(tǒng)的過(guò)程化編程。然而,對(duì)于大型項(xiàng)目,你可能需要在PHP中使用純的OOP去聲明類,而且在你的項(xiàng)目里只用對(duì)象和類。這個(gè)概念我先不多說(shuō)了,因?yàn)橛泻芏嗯笥堰h(yuǎn)離面向?qū)ο缶幊痰闹饕蚓褪且唤佑|面向?qū)ο蟾拍畹臅r(shí)候就理解不上去,所以就不想去學(xué)下去了。等讀者看完整體內(nèi)容后再去把概念搞明白吧。2 .什么是類,什么是對(duì)象,類和對(duì)象這間的關(guān)系類的概念:類是具有相同屬性和服務(wù)的一組對(duì)象的集合。它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z(yǔ)言中,類是一個(gè)
4、獨(dú)立的程序單位,它應(yīng)該有一個(gè)類名并包括屬性說(shuō)明和服務(wù)說(shuō)明兩個(gè)主要部分。對(duì)象的概念:對(duì)象是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成。從更抽象的角度來(lái)說(shuō),對(duì)象是問(wèn)題域或?qū)崿F(xiàn)域中某些事物的一個(gè)抽象,它反映該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用;它是一組屬性和有權(quán)對(duì)這些屬性進(jìn)行操作的一組服務(wù)的封裝體。客觀世界是由對(duì)象和對(duì)象之間的聯(lián)系組成的。類與對(duì)象的關(guān)系就如模具和鑄件的關(guān)系,類的實(shí)例化結(jié)果就是對(duì)象,而對(duì)一類對(duì)象的抽象就是類。類描述了一組有相同特性(屬性)和相同行為(方法)的對(duì)象。上面大概就是它們的定義吧,也許你是剛接觸面向?qū)ο?/p>
5、的朋友,不要被概念的東西搞暈了,給你舉個(gè)例子吧,如果你去中關(guān)村想買幾臺(tái)組裝的PC機(jī),到了那里你第一步要干什么,是不是裝機(jī)的工程師和你坐在一起,按你提供的信息和你一起完成一個(gè)裝機(jī)的配置單呀,這個(gè)配置單就可以想象成是類,它就是一張紙,但是它上面記錄了你要買的PC機(jī)的信息,如果用這個(gè)配置單買10臺(tái)機(jī)器,那么這10臺(tái)機(jī)子,都是按這個(gè)配置單組成的,所以說(shuō)這10臺(tái)機(jī)子是一個(gè)類型的,也可以說(shuō)是一類的。那么什么是對(duì)象呢,類的實(shí)例化結(jié)果就是對(duì)象,用這個(gè)配置單配置出來(lái)(實(shí)例化出來(lái))的機(jī)子就是對(duì)象,是我們可以操作的實(shí)體,10臺(tái)機(jī)子,10個(gè)對(duì)象。每臺(tái)機(jī)子都是獨(dú)立的,只能說(shuō)明他們是同一類的,對(duì)其中一個(gè)機(jī)做任何動(dòng)作都不會(huì)
6、影響其它9臺(tái)機(jī)器,但是我對(duì)類修改,也就是在這個(gè)配置單上加一個(gè)或少一個(gè)配件,那么裝出來(lái)的9個(gè)機(jī)子都改變了,這是類和對(duì)象的關(guān)系(類的實(shí)例化結(jié)果就是對(duì)象)。3 .什么是面向?qū)ο缶幊棠??就不說(shuō)他的概念,如果你想建立一個(gè)電腦教室,首先要有一個(gè)房間,房間里面要有N臺(tái)電腦,有N張桌子,N把椅子,白板,投影機(jī)等等,這些是什么,剛才咱們說(shuō)了,這就是對(duì)象,能看到的一個(gè)個(gè)的實(shí)體,可以說(shuō)這個(gè)電腦教室的單位就是這一個(gè)個(gè)的實(shí)體對(duì)象,它們共同組成了這個(gè)電腦教室,那么我們是做程序,這和面向?qū)ο笥惺裁搓P(guān)系呢?開(kāi)發(fā)一個(gè)系統(tǒng)程序和建一個(gè)電腦教室類似,你把每個(gè)獨(dú)立的功能模塊抽象成類,形成對(duì)象,由多個(gè)對(duì)象組成這個(gè)系統(tǒng),這些對(duì)象之間都能
7、夠接收信息、處理數(shù)據(jù)和向其它對(duì)象發(fā)送信息等等相互作用。就構(gòu)成了面向?qū)ο蟮某绦? .如何抽象出一個(gè)類?上面已經(jīng)介紹過(guò)了,面向?qū)ο蟪绦虻膯挝痪褪菍?duì)象,但對(duì)象又是通過(guò)類的實(shí)例化出來(lái)的,所以我們首先要做的就是如何來(lái)聲明類,做出來(lái)一個(gè)類很容易,只要掌握基本的程序語(yǔ)法定義規(guī)則就可以做的出來(lái),那么難點(diǎn)在那里呢?一個(gè)項(xiàng)目要用到多少個(gè)類,用多少個(gè)對(duì)象,在那要定義類,定義一個(gè)什么樣的類,這個(gè)類實(shí)例化出多少個(gè)對(duì)象,類里面有多少個(gè)屬性,有多少個(gè)方法等等,這就需要讀者通過(guò)在實(shí)際的開(kāi)發(fā)中就實(shí)際問(wèn)題分析設(shè)計(jì)和總結(jié)了。類的定義:class類名使用一個(gè)關(guān)鍵字class和后面加上一個(gè)你想要的類名以及加上一對(duì)大括號(hào),這樣一個(gè)類的結(jié)
8、構(gòu)就定義出來(lái)了,只要在里面寫代碼就可以了,但是里面寫什么?能寫什么?怎樣寫才是一個(gè)完整的類呢?上面講過(guò)來(lái),使用類是為了讓它實(shí)例出對(duì)象來(lái)給我們用,這就要知道你想要的是什么樣的對(duì)象了,像上面我們講的一個(gè)裝機(jī)配置單上寫什么,你裝出來(lái)的機(jī)子就有什么。比如說(shuō),一個(gè)人就是一個(gè)對(duì)象,你怎么把一個(gè)你看好的人推薦給你們領(lǐng)導(dǎo)呢?當(dāng)然是越詳細(xì)越好了:首先,你會(huì)介紹這個(gè)人姓名、性別、年齡、身高、體重、電話、家庭住址等等。然后,你要介紹這個(gè)人能做什么,可以開(kāi)車,會(huì)說(shuō)英語(yǔ),可以使用電腦等等。只要你介紹多一點(diǎn),別人對(duì)這個(gè)人就多一點(diǎn)了解,這就是我們對(duì)一個(gè)人的描述,現(xiàn)在我們總結(jié)一下,所有的對(duì)象我們用類去描述都是類似的,從上面人
9、的描述可以看到,做出一個(gè)類來(lái),從定義的角度分兩部分,第一是從靜態(tài)上描述,第二是從動(dòng)態(tài)上描述,靜態(tài)上的描述就是我們所說(shuō)的屬性,像上面我們看到的,人的姓名、性別、年齡、身高、體重、電話、家庭住址等等。動(dòng)態(tài)上也就是人的這個(gè)對(duì)象的功能,比如這個(gè)人可以開(kāi)車,會(huì)說(shuō)英語(yǔ),可以使用電腦等等,抽象成程序時(shí),我們把動(dòng)態(tài)的寫成函數(shù)或者說(shuō)是方法,函數(shù)和方法是一樣的。所以,所有類都是從屬性和方法這兩方面去寫,屬性又叫做這個(gè)類的成員屬性,方法叫做這個(gè)類的成員方法。class人成員屬性:姓名、性別、年齡、身高、體重、電話、家庭住址成員方法:可以開(kāi)車,會(huì)說(shuō)英語(yǔ),可以使用電腦屬性:通過(guò)在類定義中使用關(guān)鍵字var來(lái)聲明變量,即創(chuàng)
10、建了類的屬性,雖然在聲明成員屬性的時(shí)候可以給定初始值,但是在聲明類的時(shí)候給成員屬性初使值是沒(méi)有必要的,比如說(shuō)要是把人的姓名賦上張三”那么用這個(gè)類實(shí)例出幾十個(gè)人,這幾十個(gè)人都叫張三了,所以沒(méi)有必要,我們?cè)趯?shí)例出對(duì)象后給成員屬性初始值就可以了。如:var$somevar;方法(成員函數(shù)):通過(guò)在類定義中聲明函數(shù),即創(chuàng)建了類的方法。如:functionsomefun(參數(shù)歹!J表)上面就是一個(gè)類的聲明,從屬性和方法上聲明出來(lái)的一個(gè)類,但是成員屬性最好在聲明的時(shí)候不要給初始的值,因?yàn)槲覀冏龅娜诉@個(gè)類是一個(gè)描述信息,將來(lái)用它實(shí)例化對(duì)象,比如實(shí)例化出來(lái)10個(gè)人對(duì)象,那么這10個(gè)人,每一個(gè)人的名子,性別,年
11、齡都是不一樣的,所以最好不要在這個(gè)地方給成員屬性賦初值,而是對(duì)每個(gè)對(duì)象分別賦值的。用同樣的辦法可以做出你想要的類了,只要你能用屬性和方法能描述出來(lái)的實(shí)體都可以定義成類,去實(shí)例化對(duì)象。為了加強(qiáng)你對(duì)類的理解,我們?cè)僮鲆粋€(gè)類,做一個(gè)形狀的類,形狀的范圍廣了點(diǎn),我們就做個(gè)矩形吧,先分析一下,想一想從兩方面分析,矩形的屬性都有什么?矩形的功能都有什么?class矩形矩形的屬性矩形的長(zhǎng);矩形的寬;矩形的方法矩形的周長(zhǎng);矩形的面積;如果用這個(gè)類來(lái)創(chuàng)建出多個(gè)矩形對(duì)象,每個(gè)矩形對(duì)象都有自己的長(zhǎng)和寬,都可以求出自己的周長(zhǎng)和面積了。類的聲明我們就到這里吧!5 .如何實(shí)例化對(duì)象我們上面說(shuō)過(guò)面向?qū)ο蟪绦虻膯挝痪褪菍?duì)象,
12、但對(duì)象又是通過(guò)類的實(shí)例化出來(lái)的,既然我們類會(huì)聲明了,下一步就是實(shí)例化對(duì)象了。當(dāng)定義好類后,我們使用new關(guān)鍵字來(lái)生成一個(gè)對(duì)象。$對(duì)象名稱=new類名稱();$p1=newPerson();這條代碼就是通過(guò)類產(chǎn)生實(shí)例對(duì)象的過(guò)程,$p1就是我們實(shí)例出來(lái)的對(duì)象名稱,同理,$p2,$p3也是我們實(shí)例出來(lái)的對(duì)象名稱,一個(gè)類可以實(shí)例出多個(gè)對(duì)象,每個(gè)對(duì)象都是獨(dú)立的,上面的代碼相當(dāng)于實(shí)例出來(lái)3個(gè)人來(lái),每個(gè)人之間是沒(méi)有聯(lián)系的,只能說(shuō)明他們都是人類,每個(gè)人都有自己的姓名,性別和年齡的屬性,每個(gè)人都有說(shuō)話和走路的方法,只要是類里面體現(xiàn)出來(lái)的成員屬性和成員方法,實(shí)例化出來(lái)的對(duì)象里面就包含了這些屬性和方法。對(duì)像在PHP
13、里面和整型、浮點(diǎn)型一樣,也是一種數(shù)據(jù)類,都是存儲(chǔ)不同類型數(shù)據(jù)用的,在運(yùn)行的時(shí)候都要加載到內(nèi)存中去用,那么對(duì)象在內(nèi)存里面是怎么體現(xiàn)的呢??jī)?nèi)存從羅輯上說(shuō)大體上是分為4段,棧空間段、堆空間段、代碼段、初始化靜態(tài)段,程序里面不同的聲明放在不同的內(nèi)存段里面,??臻g段是存儲(chǔ)占用相同空間長(zhǎng)度并且占用空間小的數(shù)據(jù)類型的地方,比如說(shuō)整型1,10,100,1000,10000,100000等等,在內(nèi)存里面占用空間是等長(zhǎng)的,都是64位4個(gè)字節(jié)。那么數(shù)據(jù)長(zhǎng)度不定長(zhǎng),而且占有空間很大的數(shù)據(jù)類型的數(shù)據(jù)放在那內(nèi)存的那個(gè)段里面呢?這樣的數(shù)據(jù)是放在堆內(nèi)存里面的。棧內(nèi)存是可以直接存取的,而堆內(nèi)存是不可以直接存取的內(nèi)存。對(duì)于我們的
14、對(duì)象來(lái)數(shù)就是一種大的數(shù)據(jù)類型而且是占用空間不定長(zhǎng)的類型,所以說(shuō)對(duì)象是放在堆里面的,但對(duì)象名稱是放在棧里面的,這樣通過(guò)對(duì)象名稱就可以使用對(duì)象了。$p1=newPerson();對(duì)于這個(gè)條代碼,$p1是對(duì)象名稱在棧內(nèi)存里面,newPerson()是真正的對(duì)象是在堆內(nèi)存里面的,具體的請(qǐng)看下圖:從上圖可以看出$p1=newPerson()等號(hào)右邊是真正的對(duì)象實(shí)例,在堆內(nèi)存里面的實(shí)體,上圖一共有3次newPerson。所以會(huì)在堆里面開(kāi)辟3個(gè)空間,產(chǎn)生3個(gè)實(shí)例對(duì)象,每個(gè)對(duì)象之間都是相互獨(dú)立的,使用自己的空間,在PHP里面,只要有一個(gè)new這個(gè)關(guān)鍵字出現(xiàn)就會(huì)實(shí)例化出來(lái)一個(gè)對(duì)象,在堆里面開(kāi)辟一塊自己的空間。每
15、個(gè)在堆里面的實(shí)例對(duì)象是存儲(chǔ)屬性的,比如說(shuō),現(xiàn)在堆里面的實(shí)例對(duì)象里面都存有姓名、性別和年齡。每個(gè)屬性又都有一個(gè)地址。$p1=newPerson()等號(hào)的右邊$p1是一個(gè)引用變量,通過(guò)賦值運(yùn)算符“啜對(duì)象的首地址賦給“$p能個(gè)引用變量,所以$p1是存儲(chǔ)對(duì)象首地址的變量,$p1放在棧內(nèi)存里邊,$p1相當(dāng)于一個(gè)指針指向堆里面的對(duì)象,所以我們可以通過(guò)$p1這個(gè)引用變量來(lái)操作對(duì)象,通常我們也稱對(duì)象引用為對(duì)象。6 .如何去使用對(duì)象中的成員上面看到PHP對(duì)象中的成員有兩種一種是成員屬性,一種是成員方法。對(duì)象我們已經(jīng)可以聲明了,$p1=newPerson()怎么去使用對(duì)象的成員呢?要想訪問(wèn)對(duì)象中的成員就要使用一個(gè)
16、特殊的操作符”來(lái)完成對(duì)象成員的訪問(wèn):對(duì)象-屬性$p1-name;$p2-age;$p3-sex;對(duì)象-方法$p1-say();$p2-run();如下面實(shí)例:name=張三”;$p1-sex= 男”;$p1-age=20;下面三行是訪問(wèn)$p1對(duì)象的屬性echop寸象的名子是:”.$pname.”;echop寸象的性別是:”.$psex.”;echop寸象的年齡是:”.$page.”;下面兩行訪問(wèn)$p1對(duì)象中的方法$p1-say();$p1-run();下面三行是給$p2對(duì)象屬性賦值$p2-name=李四”;$p2-sex=女;$p2-age=30;下面三行是訪問(wèn)$p2對(duì)象的屬性echo“p2象
17、的名子是:”.$p2name.”;echop2象的性別是:”.$p2sex.”;echo“p2象的年齡是:”.$p2age.”;下面兩行訪問(wèn)$p2對(duì)象中的方法$p2-say();$p2-run();下面三行是給$p3對(duì)象屬性賦值$p3-name-王五”;$p3-sex=男;$p3-age=40;下面三行是訪問(wèn)$p3對(duì)象的屬性echo“p3象的名子是:”.$p3name.”;echop3象的性別是:”.$p3sex.”;echo“p3象的年齡是:”.$p3age.”;下面兩行訪問(wèn)$p3對(duì)象中的方法$p3-say();$p3-run();?從上例中可以看出只是對(duì)象里面的成員就要使用對(duì)象,屬性、對(duì)象
18、,方法形式訪問(wèn),再?zèng)]有第二種方法來(lái)訪問(wèn)對(duì)象中的成員了。7 .特殊的引用“$this的使用現(xiàn)在我們知道了如何訪問(wèn)對(duì)象中的成員,是通過(guò)對(duì)象,成員”的方式訪問(wèn)的,這是在對(duì)象的外部去訪問(wèn)對(duì)象中成員的形式,那么如果我想在對(duì)象的內(nèi)部,讓對(duì)象里的方法訪問(wèn)本對(duì)象的屬性,或是對(duì)象中的方法去調(diào)用本對(duì)象的其它方法這時(shí)我們?cè)趺崔k?因?yàn)閷?duì)象里面的所有的成員都要用對(duì)象來(lái)調(diào)用,包括對(duì)象的內(nèi)部成員之間的調(diào)用,所以在PHP里面給我提供了一個(gè)本對(duì)象的引用$this,每個(gè)對(duì)象里面都有一個(gè)對(duì)象的引用$this來(lái)代表這個(gè)對(duì)象,完成對(duì)象內(nèi)部成員的調(diào)用,this的本意就是這個(gè)”的意思,上面的實(shí)例里面,我們實(shí)例化三個(gè)實(shí)例對(duì)象$P1、$P2、
19、$P3,這三個(gè)對(duì)象里面各自存在一個(gè)$this分別代表對(duì)象$p1、$p2、$p3。通過(guò)上圖我們可以看到,$this就是對(duì)象內(nèi)部代表這個(gè)對(duì)象的引用,在對(duì)象內(nèi)部和調(diào)用本對(duì)象的成員和對(duì)象外部調(diào)用對(duì)象的成員所使用的方式是一樣的。$this-屬性$this-name;$this-age;$this-sex;$this-方法$this-say();$this-run();修改一下上面的實(shí)例,讓每個(gè)人都說(shuō)出自己的名字,性別和年齡:name.性別:”.$this-sex.我的年齡是:”.$this-age.;functionrun()/這個(gè)人可以走路的方法echo這個(gè)人在走路;$p1=newPerson();/
20、創(chuàng)建實(shí)例對(duì)象$p1$p2=newPerson();/創(chuàng)建實(shí)例對(duì)象$p2$p3=newPerson();/創(chuàng)建實(shí)例對(duì)象$p3下面三行是給$p1對(duì)象屬性賦值$p1-name=張三;$p1-sex=男;$p1-age=20;下面訪問(wèn)$p1對(duì)象中的說(shuō)話方法$p1-say();下面三行是給$p2對(duì)象屬性賦值$p2-name=李四;$p2-sex=女;$p2-age=30;下面訪問(wèn)$p2對(duì)象中的說(shuō)話方法$p2-say();下面三行是給$p3對(duì)象屬性賦值$p3-name=王五;$p3-sex=男;$p3-age=40;下面訪問(wèn)$p3對(duì)象中的說(shuō)話方法$p3-say();?輸出結(jié)果為:我的名子叫:張三性別:男我
21、的年齡是:20我的名子叫:李四性別:女我的年齡是:30我的名子叫:王五性別:男我的年齡是:40分析一下這個(gè)方法:functionsay()/這個(gè)人可以說(shuō)話的方法echo我的名子叫:”.$this-name.性別:”.$this-sex.我的年齡是:.$this-age.;在$p1、$p2和$p3這三個(gè)對(duì)象中都有say()這個(gè)方法,$this分別代表這三個(gè)對(duì)象,調(diào)用相應(yīng)的屬性,打印出屬性的值,這就是在對(duì)象內(nèi)部訪問(wèn)對(duì)象屬性的方式,如果相在say()這個(gè)方法里調(diào)用run()這個(gè)方法也是可以的,在say()這個(gè)方法中使用$this-run()的方式來(lái)完成調(diào)用。8 .構(gòu)造方法與析構(gòu)方法大多數(shù)類都有一種稱
22、為構(gòu)造函數(shù)的特殊方法。當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),它將自動(dòng)調(diào)用構(gòu)造函數(shù),也就是使用new這個(gè)關(guān)鍵字來(lái)實(shí)例化對(duì)象的時(shí)候自動(dòng)調(diào)用構(gòu)造方法。構(gòu)造函數(shù)的聲明與其它操作的聲明一樣,只是其名稱必須是_construct()。這是PHP5中的變化,以前的版本中,構(gòu)造函數(shù)的名稱必須與類名相同,這種在PHP5中仍然可以用,但現(xiàn)在以經(jīng)很少有人用了,這樣做的好處是可以使構(gòu)造函數(shù)獨(dú)立于類名,當(dāng)類名發(fā)生改變時(shí)不需要改相應(yīng)的構(gòu)造函數(shù)名稱了。為了向下兼容,如果一個(gè)類中沒(méi)有名為_(kāi)construct()的方法,PHP將搜索一個(gè)php4中的寫法,與類名相同名的構(gòu)造方法。格式:function_construct(參數(shù))在一個(gè)類中只能聲明一
23、個(gè)構(gòu)造方法,而是只有在每次創(chuàng)建對(duì)象的時(shí)候都會(huì)去調(diào)用一次構(gòu)造方法,不能主動(dòng)的調(diào)用這個(gè)方法,所以通常用它執(zhí)行一些有用的初始化任務(wù)。比如對(duì)成屬性在創(chuàng)建對(duì)象的時(shí)候賦初值。name賦初使值$this-name=$name;通過(guò)構(gòu)造方法傳進(jìn)來(lái)的$sex給成員屬性$this-sex賦初使值$this-sex=$sex;通過(guò)構(gòu)造方法傳進(jìn)來(lái)的$age給成員屬性$this-age賦初使值$this-age=$age;這個(gè)人的說(shuō)話方法functionsay()echo我的名子叫:”.$this-name.性別:”.$this-sex.我的年齡是:.$this-age.;通過(guò)構(gòu)造方法創(chuàng)建3個(gè)對(duì)象$p1、p2、$p3,
24、分別傳入三個(gè)不同的實(shí)參為姓名、性別和年齡$p1=newPerson(張?zhí)m“,“男,20);$p2=newPerson(李四工女,30);$p3=newPerson(王五,男,40);下面訪問(wèn)$p1對(duì)象中的說(shuō)話方法$p1-say();下面訪問(wèn)$p2對(duì)象中的說(shuō)話方法$p2-say();下面訪問(wèn)$p3對(duì)象中的說(shuō)話方法$p3-say();?輸出結(jié)果為:我的名子叫:張三性別:男我的年齡是:20我的名子叫:李四性別:女我的年齡是:30我的名子叫:王五性別:男我的年齡是:40如圖:析構(gòu)函數(shù):與構(gòu)造函數(shù)相對(duì)的就是析構(gòu)函數(shù)。析構(gòu)函數(shù)是PHP5新添加的內(nèi)容,在PHP4中沒(méi)有析構(gòu)函數(shù)。析構(gòu)函數(shù)允許在銷毀一個(gè)類之前執(zhí)
25、行的一些操作或完成一些功能,比如說(shuō)關(guān)閉文件,釋放結(jié)果集等,析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷毀時(shí)執(zhí)行,也就是對(duì)象在內(nèi)存中被銷毀前調(diào)用析構(gòu)函數(shù)。與構(gòu)造函數(shù)的名稱類似,一個(gè)類的析構(gòu)函數(shù)名稱必須是destruct()。析構(gòu)函數(shù)不能帶有任何參數(shù)。格式:function_destruct()name賦初使值$this-name=$name;通過(guò)構(gòu)造方法傳進(jìn)來(lái)的$sex給成員屬性$this-sex賦初使值$this-sex=$sex;通過(guò)構(gòu)造方法傳進(jìn)來(lái)的$age給成員屬性$this-age賦初使值$this-age=$age;這個(gè)人的說(shuō)話方法functionsay()echo我的名
26、子叫:”.$this-name.性別:”.$this-sex.我的年齡是:.$this-age.;這是一個(gè)析構(gòu)函數(shù),在對(duì)象銷毀前調(diào)用function_destruct()echo可見(jiàn)”.$thname.”;通過(guò)構(gòu)造方法創(chuàng)建3個(gè)對(duì)象$p1、p2、$p3,分別傳入三個(gè)不同的實(shí)參為姓名、性別和年齡$p1=newPerson(張?zhí)m“,“男,20);$p2=newPerson(李四工女,30);$p3=newPeson(主五,“男,40);下面訪問(wèn)$p1對(duì)象中的說(shuō)話方法$p1-say();下面訪問(wèn)$p2對(duì)象中的說(shuō)話方法$p2-say();下面訪問(wèn)$p3對(duì)象中的說(shuō)話方法$p3-say();?輸出結(jié)果為:我
27、的名子叫:張三性別:男我的年齡是:20我的名子叫:李四性別:女我的年齡是:30我的名子叫:王五性別:男我的年齡是:40再見(jiàn)張三再見(jiàn)李四再見(jiàn)王五9封裝性封裝性是面向?qū)ο缶幊讨械娜筇匦灾唬庋b性就是把對(duì)象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的相同單位,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),包含兩個(gè)含義:1.把對(duì)象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個(gè)不可分割的獨(dú)立單位(即對(duì)象)。2.信息隱蔽,即盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),對(duì)外形成一個(gè)邊界或者說(shuō)形成一道屏障,只保留有限的對(duì)外接口使之與外部發(fā)生聯(lián)系。封裝的原則在軟件上的反映是:要求使對(duì)象以外的部分不能隨意存取對(duì)象的內(nèi)部數(shù)據(jù)(屬性),從而有效的避免了外部錯(cuò)誤對(duì)它的交叉
28、感染,使軟件錯(cuò)誤能夠局部化,大大減少查錯(cuò)和排錯(cuò)的難度。用個(gè)實(shí)例來(lái)說(shuō)明吧,假如某個(gè)人的對(duì)象中有年齡和工資等屬性,像這樣個(gè)人隱私的屬性是不想讓其它人隨意就能獲得到的,如果你不使用封裝,那么別人想知道就能得到,但是如果你封裝上之后別人就沒(méi)有辦法獲得封裝的屬性,除非你自己把它說(shuō)出去,否則別人沒(méi)有辦法得到。再比如說(shuō),個(gè)人電腦都有一個(gè)密碼,不想讓其它人隨意的登陸,在你的電腦里面拷貝和粘貼。還有就是像人這個(gè)對(duì)象,身高和年齡的屬性,只能是自己來(lái)增漲,不可以讓別人隨意的賦值等等。使用private這個(gè)關(guān)鍵字來(lái)對(duì)屬性和方法進(jìn)行封裝:原來(lái)的成員:var$name;/聲明人的姓名var$sex;/聲明人的性別var$
29、age;/聲明人的年齡functionrun().改成封裝的形式:private$name;把人的姓名使用private關(guān)鍵字進(jìn)行封裝private$sex;/胞人的性別使用private關(guān)鍵字進(jìn)行封裝private$age;/肥人的年齡使用private關(guān)鍵字進(jìn)行封裝private function run()把人的走路方法使用private關(guān)鍵字進(jìn)行封裝注意:只要是成員屬性前面有其它的關(guān)鍵字就要去掉原有的關(guān)鍵字“AvaR通過(guò)private就可以把人的成員(成員屬性和成員方法)封裝上了。封裝上的成員就不能被類外面直接訪問(wèn)了,只有對(duì)象內(nèi)部自己可以訪問(wèn);下面的代碼會(huì)產(chǎn)生錯(cuò)誤:classPerso
30、n下面是人的成員屬性private$name;/仄的名子,被private封裝上了private$sex;/火的,性別,被private封裝上了private$age;/仄的年齡,被private封裝上了這個(gè)人可以說(shuō)話的方法functionsay()echo我的名子叫:”.$this-name.性別:”.$this-sex.我的年齡是:.$this-age.;這個(gè)人可以走路的方法,被private封裝上了privatefunctionrun()echo這個(gè)人在走路;實(shí)例化一個(gè)人的實(shí)例對(duì)象$p1=newPerson();試圖去給私有的屬性賦值,結(jié)果會(huì)發(fā)生錯(cuò)誤$p1-name=張三;$p1-sex
31、=男;$p1-age=20;試圖去打印私有的屬性,結(jié)果會(huì)發(fā)生錯(cuò)誤echo$p1-name.”;echo$p1-sex.”;echo$p1-age.”試圖去打印私有的成員方法,結(jié)果會(huì)發(fā)生錯(cuò)誤$p1-run();輸出結(jié)果為:Fatalerror:CannotaccessprivatepropertyPerson:$nameFatalerror:CannotaccessprivatepropertyPerson:$sexFatalerror:CannotaccessprivatepropertyPerson:$ageFatalerror:CannotaccessprivatepropertyPers
32、on:$nameFatalerror:CalltoprivatemethodPerson:run()fromcontext從上面的實(shí)例可以看到,私有的成員是不能被外部訪問(wèn)的,因?yàn)樗接谐蓡T只能在本對(duì)象內(nèi)部自己訪問(wèn),比如,$p1這個(gè)對(duì)象自己想把他的私有屬性說(shuō)出去,在say()這個(gè)方法里面訪問(wèn)了私有屬性,這樣是可以。(沒(méi)有加任何訪問(wèn)控制,默認(rèn)的是public的,任何地方都可以訪問(wèn))這個(gè)人可以說(shuō)話的方法,說(shuō)出自己的私有屬性,在這里也可以訪問(wèn)私有方法functionsay()echo我的名子叫:”.$this-name.性別:”.$this-sex.我的年齡是:.$this-age.;在這里也可以訪問(wèn)私
33、有方法/$this-run();因?yàn)槌蓡T方法say()是公有的,所以我們?cè)陬惖耐獠空{(diào)用say()方法是可以的,改變上面的代碼;classPerson下面是人的成員屬性private$name;人的名子,被private封裝上了private$sex;人的性別,被private封裝上了private$age;人的年齡,被private封裝上了定義一個(gè)構(gòu)造方法參數(shù)為私有的屬性姓名$name性別$sex和年齡$age進(jìn)行賦值function_construct($name,$sex,$age)通過(guò)構(gòu)造方法傳進(jìn)來(lái)的$this-name=$name;通過(guò)構(gòu)造方法傳進(jìn)來(lái)的$this-sex=$sex;通過(guò)
34、構(gòu)造方法傳進(jìn)來(lái)的$this-age=$age;這個(gè)人可以說(shuō)話的方法私有方法$name給私有成員屬性$this-name賦初使值$sex給私有成員屬性$this-sex賦初使值$age給私有成員屬性$this-age賦初使值說(shuō)出自己的私有屬性,在這里也可以訪問(wèn)functionsay()echo我的名子叫:”.$this-name.性別:”.$this-sex.我的年齡是:.$this-age.;通過(guò)構(gòu)造方法創(chuàng)建3個(gè)對(duì)象$p1、p2、$p3,分別傳入三個(gè)不同的實(shí)參為姓名、性別和年齡$p1=newPerson(張?zhí)m“,“男,20);$p2=newPerson(李四工女,30);$p3=newPers
35、on(王五,男,40);下面訪問(wèn)$p1對(duì)象中的說(shuō)話方法$p1-say();下面訪問(wèn)$p2對(duì)象中的說(shuō)話方法$p2-say();下面訪問(wèn)$p3對(duì)象中的說(shuō)話方法$p3-say();輸出結(jié)果為:我的名子叫:張三性別:男我的年齡是:20我的名子叫:李四性別:女我的年齡是:30我的名子叫:王五性別:男我的年齡是:40因?yàn)闃?gòu)造方法是默認(rèn)的公有方法(構(gòu)造方法不要設(shè)置成私有的),所以在類的外面可以訪問(wèn)到,這樣就可以使用構(gòu)造方法創(chuàng)建對(duì)象,另外構(gòu)造方法也是類里面的函數(shù),所以可以用構(gòu)造方法給私有的屬性賦初值。Say()的方法是默認(rèn)公有的,所以在外面也可以訪問(wèn)的到,說(shuō)出他自己的私有屬性。從上面的例子中我們可以看到,私有
36、的成員只能在類的內(nèi)部使用,不能被類外部直接來(lái)存取,但是在類的內(nèi)部是有權(quán)限訪問(wèn)的,所以有時(shí)候我們需要在類的外面給私有屬性賦值和讀取出來(lái),也就是給類的外部提供一些可以存取的接口,上例中構(gòu)造方法就是一種賦值的形式,但是構(gòu)造方法只是在創(chuàng)建對(duì)象的時(shí)候賦值,如果我們已經(jīng)有一個(gè)存在的對(duì)象了,想對(duì)這個(gè)存在的對(duì)象賦值,這個(gè)時(shí)候,如果你還使用構(gòu)造方法傳值的形式傳值,那么就創(chuàng)建了一個(gè)新的對(duì)象,并不是這個(gè)已存在的對(duì)象了。所以我們要對(duì)私有的屬性做一些可以被外部存取的接口,目的就是可以在對(duì)象存在的情況下,改變和存取屬性的值,但要注意,只有需要讓外部改變的屬性才這樣做,不想讓外面訪問(wèn)的屬性是不做這樣的接口的,這樣就能達(dá)到封
37、裝的目的,所有的功能都是對(duì)象自己來(lái)完成,給外面提供盡量少的操作。如果給類外部提供接口,可以為私有屬性在類外部提供設(shè)置方法和獲取方法,來(lái)操作私有屬性.例如:prvate$age;/私有的屬性年齡functionsetAge($age)為外部提供一個(gè)公有設(shè)置年齡的方法if($age130)在給屬性賦值的時(shí)候,為了避免非法值設(shè)置給屬性return;$this-age=$age;functiongetAge()為外部提供一個(gè)公有獲取年齡的方法return($this-age);上面的方法是為一個(gè)成員屬性設(shè)置和獲取值,當(dāng)然你也可以為每個(gè)屬性用同樣的方法對(duì)其進(jìn)行賦值和取值的操作,完成在類外部的存取工作。1
38、0 ._set()get()_isset()_unset(l個(gè)方法的應(yīng)用一般來(lái)說(shuō),總是把類的屬性定義為private,這更符合現(xiàn)實(shí)的邏輯。但是,對(duì)屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預(yù)定義了兩個(gè)函數(shù)get(和_set(來(lái)獲取和賦彳1具屬性,以及檢查屬性的_isset(和刪除屬性的方法”_unseQ”上一節(jié)中,我們?yōu)槊總€(gè)屬性做了設(shè)置和獲取的方法,在PHP5中給我們提供了專門為屬性設(shè)置值和獲取值的方法,_setCTget(滋兩個(gè)方法,這兩個(gè)方法不是默認(rèn)存在的,而是我們手工添加到類里面去的,像構(gòu)造方法(construct。)一樣,類里面添加了才會(huì)存在,可以按下面的方式來(lái)添加這兩個(gè)方法
39、,當(dāng)然也可以按個(gè)人的風(fēng)格來(lái)添加:get()方法用來(lái)獲取私有屬性privatefunctionget($property_name)if(isset($this-$property_name)return($this-$property_name);elsereturn(NULL);set()方法用來(lái)設(shè)置私有屬性privatefunction_set($property_name,$value)$this-$property_name=$value;get()方法:這個(gè)方法用來(lái)獲取私有成員屬性值的,有一個(gè)參數(shù),參數(shù)傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個(gè)方法不用我們手工的去調(diào)用,因?yàn)?/p>
40、我們也可以把這個(gè)方法做成私有的方法,是在直接獲取私有屬性的時(shí)候?qū)ο笞詣?dòng)調(diào)用的。因?yàn)樗接袑傩砸呀?jīng)被封裝上了,是不能直接獲取值的(比如:“echo$pnam3這樣直接獲取是錯(cuò)誤的),但是如果你在類里面加上了這個(gè)方法,在使用“echo$pnam3這樣的語(yǔ)句直接獲取值的時(shí)候就會(huì)自動(dòng)調(diào)用get($property_name方法,斗各屬性name傳給參數(shù)$property_name,通過(guò)這個(gè)方法的內(nèi)部執(zhí)行,返回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,對(duì)象本身就不會(huì)去自動(dòng)調(diào)用這個(gè)方法。_set()方法:這個(gè)方法用來(lái)為私有成員屬性設(shè)置值的,有兩個(gè)參數(shù),第一個(gè)參數(shù)為你要為設(shè)置值的屬性名,第二個(gè)參數(shù)是
41、要給屬性設(shè)置的值,沒(méi)有返回值。這個(gè)方法同樣不用我們手工去調(diào)用,它也可以做成私有的,是在直接設(shè)置私有屬性值的時(shí)候自動(dòng)調(diào)用的,同樣屬性私有的已經(jīng)被封裝上了,如果沒(méi)有_set(讓個(gè)方法,是不允許的,比如:$this-name=zhangsan這樣會(huì)出錯(cuò),但是如果你在類里面加上了set($property_name,$valu噠個(gè)方法,在直接給私有屬性賦值的時(shí)候,就會(huì)自動(dòng)調(diào)用它,把屬性比如name傳給$property_name,把要賦的值“zhangsarn$value,通過(guò)這個(gè)方法的執(zhí)行,達(dá)到賦值的目的。如果成員屬性不封裝成私有的,對(duì)象本身就不會(huì)去自動(dòng)調(diào)用這個(gè)方法。為了不傳入非法的值,還可以在這個(gè)
42、方法給做一下判斷。代碼如下:?phpclassPerson下面是人的成員屬性,都是封裝的私有成員private$name;人的名子private$sex;人的性別private$age;人的年齡get()方法用來(lái)獲取私有屬性privatefunctionget($property_name)echo在直接獲取私有屬性值的日t候,自動(dòng)調(diào)用了這個(gè)get()方法;if(isset($this-$property_name)return($this-$property_name);elsereturn(NULL);set()方法用來(lái)設(shè)置私有屬性privatefunction_set($property
43、_name,$value)echo在直接設(shè)置私有屬性值的日t候,自動(dòng)調(diào)用了這個(gè)_set()方法為私有屬性賦值;$this-$property_name=$value;$p1=newPerson();直接為私有屬性賦值的操作,會(huì)自動(dòng)調(diào)用_set()方法進(jìn)行賦值$p1-name=張三;$p1-sex=男;$p1-age=20;直接獲取私有屬性的值,會(huì)自動(dòng)調(diào)用get()方法,返回成員屬性的值echo姓名:”.$p1-name.;echo性別:”.$p1-sex.;echo年齡:”.$p1-age.;?程序執(zhí)行結(jié)果:在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)性賦值在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了
44、這個(gè)性賦值在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)性賦值在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)姓名:張三在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)性別:男set()方法為私有屬set()方法為私有屬set()方法為私有屬.get()方法.get()方法.get()方法在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)年齡:20以上代碼如果不加上get()和_set()方法,程序就會(huì)出錯(cuò),因?yàn)椴荒茉陬惖耐獠坎僮魉接谐蓡T,而上面的代碼是通過(guò)自動(dòng)調(diào)用get()和_set()方法來(lái)幫助我們直接存取封裝的私有成員的。isset()方法:在看這個(gè)方法之前我們看一下“issetO數(shù)的應(yīng)用,isset()是測(cè)定
45、變量是否設(shè)定用的函數(shù),傳入一個(gè)變量作為參數(shù),如果傳入的變量存在則傳回true,否則傳回false。那么如果在一個(gè)對(duì)象外面使用“isset(這個(gè)函數(shù)去測(cè)定對(duì)象里面的成員是否被設(shè)定可不可以用它呢?分兩種情況,如果對(duì)象里面成員是公有的,我們就可以使用這個(gè)函數(shù)來(lái)測(cè)定成員屬性,如果是私有的成員屬性,這個(gè)函數(shù)就不起作用了,原因就是因?yàn)樗接械谋环庋b了,在外部不可見(jiàn)。那么我們就不可以在對(duì)象的外部使用“issetO數(shù)來(lái)測(cè)定私有成員屬性是否被設(shè)定了呢?可以,你只要在類里面加上一個(gè)“_isset(W法就可以了,當(dāng)在類外部使用isset()a數(shù)來(lái)測(cè)定對(duì)象里面的私有成員是否被設(shè)定時(shí),就會(huì)自動(dòng)調(diào)用類里面的_isset(訪法了幫我們完成這樣的操作,_isset(W法也可以做成私有的。你可以在類里面加上下面這樣的代碼就可以了:privatefunction_isset($nm
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年遼寧省事業(yè)單位教師招聘考試地理學(xué)科專業(yè)知識(shí)試卷
- 2025年法律職業(yè)資格考試客觀題試卷一:法律程序與證據(jù)規(guī)則
- 小額資金審批管理辦法
- 小區(qū)集中供暖管理辦法
- 2025年工具鉗工職業(yè)技能鑒定試卷在線答題系統(tǒng)
- 租賃資產(chǎn)計(jì)劃管理辦法
- 2025年成都市事業(yè)單位招聘考試教師招聘英語(yǔ)學(xué)科專業(yè)知識(shí)試題
- 小學(xué)加班補(bǔ)助管理辦法
- 2025年導(dǎo)游資格證考試筆試模擬試卷:導(dǎo)游帶團(tuán)過(guò)程中的法律法規(guī)試題
- 小米公司用戶管理辦法
- 江蘇南京金陵中學(xué)2024~2025學(xué)年高二下冊(cè)期末考試數(shù)學(xué)試題含解析
- 2025年醫(yī)療美容行業(yè)私密整形技術(shù)與市場(chǎng)規(guī)范報(bào)告
- 公司攝影小組活動(dòng)方案
- 銀行 輿情培訓(xùn) 課件
- 2025至2030中國(guó)海洋生物技術(shù)行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及競(jìng)爭(zhēng)格局與投資發(fā)展報(bào)告
- 【課件】破繭 逐光-2026屆新高三啟航主題班會(huì):挑戰(zhàn)極限成就夢(mèng)想(含規(guī)劃指南、學(xué)法指導(dǎo)、心理護(hù)航)
- 教師學(xué)雷鋒管理制度
- 湖南2025年湖南江華瑤族自治縣招聘184名事業(yè)單位工作人員筆試歷年參考題庫(kù)附帶答案詳解
- 2025至2030中國(guó)化妝品檢測(cè)行業(yè)發(fā)展分析及競(jìng)爭(zhēng)策略與趨勢(shì)預(yù)測(cè)報(bào)告
- 盤古java面試題及答案
- 2024中儲(chǔ)糧考試題庫(kù)與答案
評(píng)論
0/150
提交評(píng)論