




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux+PHP+MYSQL第5講 面向?qū)ο?第5講 面向?qū)ο蟮腜HPOOP的好處關(guān)鍵的OOP概念構(gòu)造函數(shù)和析構(gòu)函數(shù)靜態(tài)類成員OOP(Object-Oriented Programming,面向?qū)ο蟮木幊蹋㎡OP的好處封裝 繼承 多態(tài)什么是面向?qū)ο缶幊堂鎸?duì)對(duì)象技術(shù)的基本觀點(diǎn)如下:(1)客觀世界由對(duì)象組成。(2)具有相同數(shù)據(jù)和操作的對(duì)象可歸納成類。(3)類可以派生出子類,子類除了繼承除了繼承父類的全部特性外還可以有自己的特性(4)對(duì)象之間的聯(lián)系通過消息傳遞來(lái)維系。關(guān)鍵的OOP概念面向?qū)ο缶幊蹋∣bject Oriented Programming, OOP, 面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程
2、架構(gòu),OOP的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成,OOP達(dá)到了軟件工程的三個(gè)目標(biāo):重用性、靈活性和擴(kuò)展性。面向?qū)ο笠恢笔擒浖_發(fā)領(lǐng)域內(nèi)比較熱門的話題,首先,面向?qū)ο蠓先祟惪创挛锏囊话阋?guī)律。 其次,采用面向?qū)ο蠓椒梢允瓜到y(tǒng)各部分各司其職、各盡所能。為編程人員敞開了一扇大門,使其編程的代碼更簡(jiǎn)潔、更易于維護(hù),并且具有更強(qiáng)的可重用性。PHP 是一個(gè)混合型語(yǔ)言,你可以使用OOP,也可以使用傳統(tǒng)的過程化編程 。然而,對(duì)于大型項(xiàng)目,你可能需要在PHP 中使用純的OOP去聲明類,而且在你的項(xiàng)目里只用對(duì)象和類 。關(guān)鍵的OOP概念面向?qū)ο缶幊趟枷氲慕?關(guān)鍵的OOP概念
3、的理解掌握,這是基礎(chǔ) 例如:類、類的屬性、類的方法、訪問權(quán)限 構(gòu)造函數(shù)、析構(gòu)函數(shù)等。 如何應(yīng)用面向?qū)ο蟮木幊趟枷?主要是根據(jù)畫面和系統(tǒng)的開發(fā)架構(gòu),源頭:理解畫面從何而來(lái),目的:類設(shè)計(jì)好之后的代碼如何實(shí)現(xiàn)。 關(guān)鍵的OOP概念類 類是具有相同屬性和服務(wù)的一組對(duì)象的集合。它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z(yǔ)言中,類是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類名并包括屬性說明和服務(wù)說明兩個(gè)主要部分。 對(duì)象 對(duì)象是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成。 類和對(duì)象這間的關(guān)系 類
4、與對(duì)象的關(guān)系就如模具和鑄件的關(guān)系,類的實(shí)例化結(jié)果就是對(duì)象,而對(duì)一類對(duì)象的抽象就是類。類描述了一組有相同特性(屬性)和相同行為(方法)的對(duì)象。 舉例:一個(gè)裝機(jī)的配置單,這個(gè)配置單就可以想象成是類 。組裝的PC機(jī)可以看作是該類的對(duì)象。將相關(guān)的變量和方法封裝進(jìn)一個(gè)簡(jiǎn)潔的軟件組合是一種簡(jiǎn)單而強(qiáng)大的思想,它給軟件開發(fā)人員提供了兩個(gè)主要的好處:模塊化:一個(gè)對(duì)象的源代碼可以獨(dú)立于其他對(duì)象的源代碼進(jìn)行編寫和維護(hù)。另外,對(duì)象很容易地在系統(tǒng)中傳遞。你可以將你的自行車對(duì)象交給其他人,而它仍然會(huì)正常工作。 隱藏信息:對(duì)象有一個(gè)公共接口,其他對(duì)象可以使用這個(gè)接口與它通信。對(duì)象可以維護(hù)私有的信息和方法,可以在任何時(shí)候改變
5、這些信息和方法,而不影響依賴于它的其他對(duì)象。你不需要理解你自行車使用的變速齒輪機(jī)制就能夠使用它。軟件對(duì)象 對(duì)象屬性型號(hào)價(jià)格里程行為起動(dòng)停車行駛屬性車輪數(shù)量檔的數(shù)量行為加速換檔剎車屬性名稱顏色品種行為搖尾巴吃東西犬 吠 關(guān)鍵的OOP概念面向?qū)ο?如果你想建立一個(gè)電腦教室,首先要有一個(gè)房間,房間里面要有N臺(tái)電腦,有N張桌子, N把椅子,白板,投影機(jī)等等,這些是什么,剛才咱們說了,這就是對(duì)象,能看到的一個(gè)個(gè)的實(shí)體,可以說這個(gè)電腦教室的單位就是這一個(gè)個(gè)的實(shí)體對(duì)象,它們共同組成了這個(gè)電腦教室,那么我們是做程序,這和面向?qū)ο笥惺裁搓P(guān)系呢?開發(fā)一個(gè)系統(tǒng)程序和建一個(gè)電腦教室類似,你把每個(gè)獨(dú)立的功能模塊抽象成類
6、,形成對(duì)象,由多個(gè)對(duì)象組成這個(gè)系統(tǒng),這些對(duì)象之間都能夠接收信息、處理數(shù)據(jù)和向其它對(duì)象發(fā)送信息等等相互作用。就構(gòu)成了面向?qū)ο蟮某绦颉?如何抽象出一個(gè)類? 上面已經(jīng)介紹過了,面向?qū)ο蟪绦虻膯挝痪褪菍?duì)象,但對(duì)象又是通過類的實(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è)方法等等,這就需要讀者通過在實(shí)際的開發(fā)中就實(shí)際問題分析設(shè)計(jì)和總結(jié)了。 (系統(tǒng)架構(gòu)師主要是根據(jù)每個(gè)項(xiàng)目的頁(yè)面來(lái)判斷)。關(guān)鍵的O
7、OP概念類的定義: class 類名 舉例:人是一個(gè)對(duì)象,你怎么把一個(gè)你看好的人推薦給你們領(lǐng)導(dǎo)呢?首先,你會(huì)介紹這個(gè)人姓名、性別、年齡、身高、體重、電話、家庭住址等等。然后,你要介紹這個(gè)人能做什么,可以開車,會(huì)說英語(yǔ),可以使用電腦等等??偨Y(jié):所有的對(duì)象我們用類去描述都是類似的,從上面人的描述可以看到, 做出一個(gè)類來(lái),從定義的角度分兩部分,第一是從靜態(tài)上描述,第二是從動(dòng)態(tài)上描述,靜態(tài)上的描述就是我們所說的屬性,像上面我們看到的,人的姓名、性別、年齡、身高、體重、電話、家庭住址等等。 動(dòng)態(tài)上也就是人的這個(gè)對(duì)象的功能,比如這個(gè)人可以開車,會(huì)說英語(yǔ),可以使用電腦等等 。關(guān)鍵的OOP概念抽象: 抽象成程
8、序時(shí),我們把靜態(tài)的說成類的屬性,把動(dòng)態(tài)的寫成函數(shù)或者說是方法,函數(shù)和方法。 所有類都是從屬性和方法這兩方面去寫,屬性又叫做這個(gè)類的成員屬性,方法叫做這個(gè)類的成員方法。 class 人 成員屬性:姓名、性別、年齡、身高、體重、電話、家庭住址成員方法:可以開車, 會(huì)說英語(yǔ), 可以使用電腦 屬性:通過在類定義中使用關(guān)鍵字 var 來(lái)聲明變量,即創(chuàng)建了類的屬性,雖然在聲明成員屬性的時(shí)候可以給定初始值, 但是在聲明類的時(shí)候給成員屬性初使值是沒有必要的,比如說要是把人的姓名賦上“張三”,那么用這個(gè)類實(shí)例出幾十個(gè)人,這幾十個(gè)人都叫張三了,所以沒有必要, 我們?cè)趯?shí)例出對(duì)象后給成員屬性初始值就可以了。如:var
9、 $somevar;關(guān)鍵的OOP概念方法(成員函數(shù)):通過在類定義中聲明函數(shù),即創(chuàng)建了類的方法。如:function somefun(參數(shù)列表) . . 關(guān)鍵的OOP概念注意:不要給初始的值,因?yàn)槲覀冏龅娜诉@個(gè)類是一個(gè)描述信息,將來(lái)用它實(shí)例化對(duì)象,比如實(shí)例化出來(lái)10個(gè)人對(duì)象,那么這10個(gè)人, 每一個(gè)人的名子,性別, 年齡都是不一樣的,所以最好不要在這個(gè)地方給成員屬性賦初值,而是對(duì)每個(gè)對(duì)象分別賦值的。 再做一個(gè)類,我們就做個(gè)矩形吧,先分析一下,想一想從兩方面分析,矩形的屬性都有什么?矩形的功能都有什么?class 矩形/矩形的屬性矩形的長(zhǎng); 矩形的寬;/矩形的方法矩形的周長(zhǎng);矩形的面積;關(guān)鍵的O
10、OP概念關(guān)鍵的OOP概念如何去使用對(duì)象中的成員 ?上面看到PHP對(duì)象中的成員有兩種一種是成員屬性,一種是成員方法。對(duì)象我們已經(jīng)可以聲明了,$p1=new Person(); 怎么去使用對(duì)象的成員呢?要想訪問對(duì)象中的成員就要使用一個(gè)特殊的操作符“-”來(lái)完成對(duì)象成員的訪問: 對(duì)象-屬性 $p1-name; $p2-age; $p3-sex; 對(duì)象-方法 $p1-say(); $p2-run();name=”張三”;$p1-sex=”男”;$p1-age=20;/下面三行是訪問$p1對(duì)象的屬性echo “p1對(duì)象的名子是:”.$p1-name.”;echo “p1對(duì)象的性別是:”.$p1-sex.”
11、;echo “p1對(duì)象的年齡是:”.$p1-age.”;/下面兩行訪問$p1對(duì)象中的方法$p1-say();$p1-run();關(guān)鍵的OOP概念下面三行是給$p2對(duì)象屬性賦值$p2-name=”李四”;$p2-sex=”女”;$p2-age=30;/下面三行是訪問$p2對(duì)象的屬性echo “p2對(duì)象的名子是:”.$p2-name.”;echo “p2對(duì)象的性別是:”.$p2-sex.”;echo “p2對(duì)象的年齡是:”.$p2-age.”;/下面兩行訪問$p2對(duì)象中的方法$p2-say();$p2-run();/下面三行是給$p3對(duì)象屬性賦值$p3-name=”王五”;$p3-sex=”男”;
12、$p3-age=40;/下面三行是訪問$p3對(duì)象的屬性echo “p3對(duì)象的名子是:”.$p3-name.”;echo “p3對(duì)象的性別是:”.$p3-sex.”;echo “p3對(duì)象的年齡是:”.$p3-age.”;/下面兩行訪問$p3對(duì)象中的方法$p3-say();$p3-run();關(guān)鍵的OOP概念特殊的引用“$this”的使用 現(xiàn)在我們知道了如何訪問對(duì)象中的成員,是通過“對(duì)象-成員”的方式訪問的,這是在對(duì)象的外部去訪問對(duì)象中成員的形式,那么如果我想在對(duì)象的內(nèi)部,讓對(duì)象里的方法訪問本對(duì)象的屬性,或是對(duì)象中的方法去調(diào)用本對(duì)象的其它方法這時(shí)我們?cè)趺崔k?因?yàn)閷?duì)象里面的所有的成員都要用對(duì)象來(lái)調(diào)用
13、,包括對(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、 $P3,這三個(gè)對(duì)象里面各自存在一個(gè)$this分別代表對(duì)象$p1、$p2、$p3 。關(guān)鍵的OOP概念通過上圖我們可以看到,$this就是對(duì)象內(nèi)部代表這個(gè)對(duì)象的引用,在對(duì)象內(nèi)部和調(diào)用本對(duì)象的成員和對(duì)象外部調(diào)用對(duì)象的成員所使用的方式是一樣的 修改一下上面的實(shí)例,讓每個(gè)人都說出自己的名字,性別和年齡: 關(guān)鍵的OOP概念name. 性別:.$thi
14、s-sex. 我的年齡是:.$this-age.; function run() /這個(gè)人可以走路的方法 echo 這個(gè)人在走路; 關(guān)鍵的OOP概念$p1=new Person(); /創(chuàng)建實(shí)例對(duì)象$p1$p2=new Person(); /創(chuàng)建實(shí)例對(duì)象$p2$p3=new Person(); /創(chuàng)建實(shí)例對(duì)象$p3/下面三行是給$p1對(duì)象屬性賦值$p1-name=張三;$p1-sex=男;$p1-age=20;/下面訪問$p1對(duì)象中的說話方法$p1-say();/下面三行是給$p2對(duì)象屬性賦值$p2-name=李四;$p2-sex=女;$p2-age=30;/下面訪問$p2對(duì)象中的說話方法$p
15、2-say();/下面三行是給$p3對(duì)象屬性賦值$p3-name=王五;$p3-sex=男;$p3-age=40;/下面訪問$p3對(duì)象中的說話方法$p3-say();?關(guān)鍵的OOP概念Result: 我的名字叫:張三性別:男我的年齡是:20我的名字叫:李四性別:女我的年齡是:30我的名字叫:王五性別:男我的年齡是:40在$p1、$p2和$p3這三個(gè)對(duì)象中都有say()這個(gè)方法,$this分別代表這三個(gè)對(duì)象, 調(diào)用相應(yīng)的屬性,打印出屬性的值,這就是在對(duì)象內(nèi)部訪問對(duì)象屬性的方式, 如果相在say()這個(gè)方法里調(diào)用run()這個(gè)方法也是可以的,在say()這個(gè)方法中使用$this-run()的方式來(lái)
16、完成調(diào)用。 關(guān)鍵的OOP概念構(gòu)造方法與析構(gòu)方法 大多數(shù)類都有一種稱為構(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è)類中沒有名為_construct( )的方法,PHP將搜索一個(gè)php4中的寫法,與類名相同名的構(gòu)造方法。
17、 格式:function _construct ( 參數(shù) ) . . 在一個(gè)類中只能聲明一個(gè)構(gòu)造方法,而是只有在每次創(chuàng)建對(duì)象的時(shí)候都會(huì)去調(diào)用一次構(gòu)造方法,不能主動(dòng)的調(diào)用這個(gè)方法,所以通常用它執(zhí)行一些有用的初始化任務(wù)。比如對(duì)成屬性在創(chuàng)建對(duì)象的時(shí)候賦初值。關(guān)鍵的OOP概念name賦初使值$this-name=$name;/通過構(gòu)造方法傳進(jìn)來(lái)的$sex給成員屬性$this-sex賦初使值$this-sex=$sex;/通過構(gòu)造方法傳進(jìn)來(lái)的$age給成員屬性$this-age賦初使值$this-age=$age;/這個(gè)人的說話方法function say()echo 我的名子叫:.$this-name
18、. 性別:.$this-sex. 我的年齡是:.$this-age.;關(guān)鍵的OOP概念/通過構(gòu)造方法創(chuàng)建3個(gè)對(duì)象$p1、p2、$p3,分別傳入三個(gè)不同的實(shí)參為姓名、性別和年齡$p1=new Person(“張三”,”男”, 20);$p2=new Person(“李四”,”女”, 30);$p3=new Person(“王五”,”男”, 40);/下面訪問$p1對(duì)象中的說話方法$p1-say();/下面訪問$p2對(duì)象中的說話方法$p2-say();/下面訪問$p3對(duì)象中的說話方法$p3-say();?Result:我的名子叫:張三性別:男我的年齡是:20我的名子叫:李四性別:女我的年齡是:30
19、我的名子叫:王五性別:男我的年齡是:40關(guān)鍵的OOP概念析構(gòu)函數(shù) 與構(gòu)造函數(shù)相對(duì)的就是析構(gòu)函數(shù)。析構(gòu)函數(shù)是PHP5新添加的內(nèi)容,在PHP4中沒有析構(gòu)函數(shù)。析構(gòu)函數(shù)允許在銷毀一個(gè)類之前執(zhí)行的一些操作或完成一些功能,比如說關(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 ( ) . . 關(guān)鍵的OOP概念name賦初使值$this-name=$name;/通過構(gòu)造方法傳進(jìn)來(lái)的
20、$sex給成員屬性$this-sex賦初使值$this-sex=$sex;/通過構(gòu)造方法傳進(jìn)來(lái)的$age給成員屬性$this-age賦初使值$this-age=$age;/這個(gè)人的說話方法function say()echo 我的名子叫:.$this-name. 性別:.$this-sex. 我的年齡是:.$this-age.;關(guān)鍵的OOP概念/這是一個(gè)析構(gòu)函數(shù),在對(duì)象銷毀前調(diào)用function _destruct()echo “再見”.$this-name.”;/通過構(gòu)造方法創(chuàng)建3個(gè)對(duì)象$p1、p2、$p3,分別傳入三個(gè)不同的實(shí)參為姓名、性別和年齡$p1=new Person(“張三”,”男
21、”, 20);$p2=new Person(“李四”,”女”, 30);$p3=new Person(“王五”,”男”, 40);/下面訪問$p1對(duì)象中的說話方法$p1-say();/下面訪問$p2對(duì)象中的說話方法$p2-say();/下面訪問$p3對(duì)象中的說話方法$p3-say();?Result:我的名子叫:張三性別:男我的年齡是:20我的名子叫:李四性別:女我的年齡是:30我的名子叫:王五性別:男我的年齡是:40再見張三再見李四再見王五關(guān)鍵的OOP概念 小結(jié):類的代碼規(guī)范class Something/ 在OOP中,類的第一字母通常為大寫 var $x; #define a setter
22、 for the $x member. function setX($v) /方法開始為小寫單詞,然后使用大寫字母來(lái)分割單詞,例如:getValueOfArea( ) /另外注意Function要縮進(jìn)3格 $this-x=$v; #define a getter for the $x member. function getX( ) return this-x; #end Executive class 數(shù)據(jù)成員在類中使用”var”來(lái)定義,在給數(shù)據(jù)成員賦值之前,它們是沒有類型的。一個(gè)數(shù)據(jù)成員可以是一個(gè)整數(shù),一個(gè)數(shù)組或者是一個(gè)對(duì)象。 方法在類中被定義成函數(shù)形式,在方法中訪問類成員變量時(shí),你應(yīng)該使
23、用$this-name,否則對(duì)一個(gè)方法來(lái)說,它只能是局部變量。(PHP5是直接可以使用變量,而不需要事先聲明,而其他語(yǔ)言(C#,Java),必須先聲明要一個(gè)變量的數(shù)據(jù)類型,才能使用)關(guān)鍵的OOP概念 小結(jié):類的調(diào)用$obj = new Something; /在內(nèi)存中分配存儲(chǔ)空間然后你可以使用成員函數(shù)通過:$obj -setX(5);$see = $obj -getX();在這個(gè)例子中,setX成員函數(shù)將5賦值給對(duì)象的成員變量x(而不是類的),然后getX返回它的值5.關(guān)鍵的OOP概念 PHP4的OOP 托PHP4的福,這個(gè)用途的適用范圍逐漸變廣起來(lái),作為企業(yè)級(jí)的用途而使用PHP的說法時(shí)有所聞
24、,因此就用了這樣一個(gè)問題,構(gòu)筑大規(guī)模網(wǎng)站的時(shí)候,代碼的再利用性十分差。具體來(lái)說就是PHP4的面向?qū)ο笮阅芎苋?,因此?xí)慣了使用Java或C#的技術(shù)人員都對(duì)此有很多的抱怨。 逐步改善PHP4的面向?qū)ο蟮男阅?,大幅度的更改基本文法,開發(fā)者達(dá)成了更新PHP記述方法的開拓目的。關(guān)鍵的OOP概念 PHP5的新特性 對(duì)象的參照過渡是默認(rèn)的 例如: $obj = new Something; 上面的語(yǔ)句可以分為兩部分來(lái)理解:右邊的是第一步:在內(nèi)存中分配空間;左邊的是第二步,$obj是一個(gè)對(duì)象引用,它是一個(gè)指針,指向第一步在內(nèi)存中分配過的空間地址。而不是將右邊的內(nèi)存中的空間復(fù)制給$obj.引用了訪問屬性的限制引
25、用了訪問方法的限制抽象類和抽象方法接口Final聲明名空間類內(nèi)常量類變量統(tǒng)一的構(gòu)造函數(shù)析構(gòu)函數(shù)關(guān)鍵的OOP概念 對(duì)象的引用在PHP4中,在以變量$var1為類的實(shí)體對(duì)象時(shí),如果使用$var2=$var1,那么,在$var2中,$var1的復(fù)制被代入。明顯的, $var2為了指向與$var1相同的對(duì)象,就要寫成 $var2=&$var1,必須要加上&作為參照。在PHP5中,對(duì)象的代入將成為自動(dòng)的參照過渡,也就是說, $var2=$var1,兩者指向相同的對(duì)象,如果想要同PHP4一樣,帶入copy,那么就會(huì)運(yùn)用到導(dǎo)入_clone()方法。 $var2=$var1-_clone();此處clone(
26、)前面是兩個(gè)連續(xù)的”_” (這僅僅是類的實(shí)體的特性)關(guān)鍵的OOP概念封裝性 封裝性是面向?qū)ο缶幊讨械娜筇匦灾?,封裝性就是把對(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è)邊界或者說形成一道屏障,只保留有限的對(duì)外接口使之與外部發(fā)生聯(lián)系。封裝的原則在軟件上的反映是:要求使對(duì)象以外的部分不能隨意存取對(duì)象的內(nèi)部數(shù)據(jù)(屬性),從而有效的避免了外部錯(cuò)誤對(duì)它的交叉感染,使軟件錯(cuò)誤能夠局部化,大大減少查錯(cuò)和排錯(cuò)的難度。 用個(gè)實(shí)例來(lái)說明吧,
27、假如某個(gè)人的對(duì)象中有年齡和工資等屬性,像這樣個(gè)人隱私的屬性是不想讓其它人隨意就能獲得到的,如果你不使用封裝,那么別人想知道就能得到,但是如果你封裝上之后別人就沒有辦法獲得封裝的屬性,除非你自己把它說出去,否則別人沒有辦法得到。 再比如說,個(gè)人電腦都有一個(gè)密碼,不想讓其它人隨意的登陸,在你的電腦里面拷貝和粘貼。還有就是像人這個(gè)對(duì)象,身高和年齡的屬性,只能是自己來(lái)增漲,不可以讓別人隨意的賦值等等。關(guān)鍵的OOP概念使用private這個(gè)關(guān)鍵字來(lái)對(duì)屬性和方法進(jìn)行封裝: 原來(lái)的成員: var $name; /聲明人的姓名 var $sex; /聲明人的性別 var $age; /聲明人的年齡 funct
28、ion run().改成封裝的形式: 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)鍵字“var”。 關(guān)鍵的OOP概念通過private就可以把人的成員(成員屬性和成員方法)封裝上了。封裝上的成員就不能被類外面直接訪問了,只有對(duì)象內(nèi)部自己可以訪問;下面的代碼會(huì)產(chǎn)生錯(cuò)誤:cl
29、ass Person/下面是人的成員屬性private $name; /人的名子,被private封裝上了private $sex; /人的性別, 被private封裝上了private $age; /人的年齡, 被private封裝上了/這個(gè)人可以說話的方法function say()echo 我的名子叫:.$this-name. 性別:.$this-sex. 我的年齡是:.$this-age.;/這個(gè)人可以走路的方法, 被private封裝上了private function run()echo 這個(gè)人在走路;關(guān)鍵的OOP概念/實(shí)例化一個(gè)人的實(shí)例對(duì)象$p1=new Person();/試圖
30、去給私有的屬性賦值, 結(jié)果會(huì)發(fā)生錯(cuò)誤$p1-name=張三;$p1-sex=男;$p1-age=20;/試圖去打印私有的屬性, 結(jié)果會(huì)發(fā)生錯(cuò)誤echo $p1-name.”;echo $p1-sex.”;echo $p1-age.”/試圖去打印私有的成員方法, 結(jié)果會(huì)發(fā)生錯(cuò)誤$p1-run();輸出結(jié)果為:Fatal error: Cannot access private property Person:$nameFatal error: Cannot access private property Person:$sexFatal error: Cannot access private
31、property Person:$ageFatal error: Cannot access private property Person:$nameFatal error: Call to private method Person:run() from context 關(guān)鍵的OOP概念從上面的實(shí)例可以看到,私有的成員是不能被外部訪問的,因?yàn)樗接谐蓡T只能在本對(duì)象內(nèi)部自己訪問,比如,$p1這個(gè)對(duì)象自己想把他的私有屬性說出去,在say()這個(gè)方法里面訪問了私有屬性,這樣是可以。(沒有加任何訪問控制,默認(rèn)的是public的,任何地方都可以訪問)/這個(gè)人可以說話的方法, 說出自己的私有屬性,在這里
32、也可以訪問私有方法 function say() echo “我的名字叫:.$this-name. 性別:.$this-sex. 我的年齡是:.$this-age.; /在這里也可以訪問私有方法 /$this-run(); 因?yàn)槌蓡T方法say()是公有的,所以我們?cè)陬惖耐獠空{(diào)用say()方法是可以的,改變上面的代碼;關(guān)鍵的OOP概念class Person/下面是人的成員屬性private $name; /人的名子,被private封裝上了private $sex; /人的性別, 被private封裝上了private $age; /人的年齡, 被private封裝上了/定義一個(gè)構(gòu)造方法參數(shù)為
33、私有的屬性姓名$name、性別$sex和年齡$age進(jìn)行賦值function _construct($name, $sex, $age)/通過構(gòu)造方法傳進(jìn)來(lái)的$name給私有成員屬性$this-name賦初使值$this-name=$name;/通過構(gòu)造方法傳進(jìn)來(lái)的$sex給私有成員屬性$this-sex賦初使值$this-sex=$sex;/通過構(gòu)造方法傳進(jìn)來(lái)的$age給私有成員屬性$this-age賦初使值$this-age=$age;/這個(gè)人可以說話的方法, 說出自己的私有屬性,在這里也可以訪問私有方法function say()echo 我的名子叫:.$this-name. 性別:.$
34、this-sex. 我的年齡是:.$this-age.;關(guān)鍵的OOP概念/通過構(gòu)造方法創(chuàng)建3個(gè)對(duì)象$p1、p2、$p3,分別傳入三個(gè)不同的實(shí)參為姓名、性別和年齡$p1=new Person(“張三”,”男”, 20);$p2=new Person(“李四”,”女”, 30);$p3=new Person(“王五”,”男”, 40);/下面訪問$p1對(duì)象中的說話方法$p1-say();/下面訪問$p2對(duì)象中的說話方法$p2-say();/下面訪問$p3對(duì)象中的說話方法$p3-say();輸出結(jié)果為:我的名字叫:張三性別:男我的年齡是:20 我的名字叫:李四性別:女我的年齡是:30 我的名字叫:王
35、五性別:男我的年齡是:40關(guān)鍵的OOP概念因?yàn)闃?gòu)造方法是默認(rèn)的公有方法(構(gòu)造方法不要設(shè)置成私有的),所以在類的外面可以訪問到,這樣就可以使用構(gòu)造方法創(chuàng)建對(duì)象,另外構(gòu)造方法也是類里面的函數(shù),所以可以用構(gòu)造方法給私有的屬性賦初值。Say()的方法是默認(rèn)公有的,所以在外面也可以訪問的到,說出他自己的私有屬性。 從上面的例子中我們可以看到,私有的成員只能在類的內(nèi)部使用,不能被類外部直接來(lái)存取,但是在類的內(nèi)部是有權(quán)限訪問的,所以有時(shí)候我們需要在類的外面給私有屬性賦值和讀取出來(lái),也就是給類的外部提供一些可以存取的接口,上例中構(gòu)造方法就是一種賦值的形式,但是構(gòu)造方法只是在創(chuàng)建對(duì)象的時(shí)候賦值,如果我們已經(jīng)有一
36、個(gè)存在的對(duì)象了,想對(duì)這個(gè)存在的對(duì)象賦值,這個(gè)時(shí)候,如果你還使用構(gòu)造方法傳值的形式傳值,那么就創(chuàng)建了一個(gè)新的對(duì)象,并不是這個(gè)已存在的對(duì)象了。所以我們要對(duì)私有的屬性做一些可以被外部存取的接口,目的就是可以在對(duì)象存在的情況下,改變和存取屬性的值,但要注意,只有需要讓外部改變的屬性才這樣做,不想讓外面訪問的屬性是不做這樣的接口的,這樣就能達(dá)到封裝的目的,所有的功能都是對(duì)象自己來(lái)完成,給外面提供盡量少的操作。關(guān)鍵的OOP概念如果給類外部提供接口,可以為私有屬性在類外部提供設(shè)置方法和獲取方法,來(lái)操作私有屬性.例如 prvate $age; /私有的屬性年齡function setAge($age) /為外
37、部提供一個(gè)公有設(shè)置年齡的方法if($age130) /在給屬性賦值的時(shí)候,為了避免非法值設(shè)置給屬性return;$this-age=$age;function getAge() /為外部提供一個(gè)公有獲取年齡的方法return($this-age);上面的方法是為一個(gè)成員屬性設(shè)置和獲取值,當(dāng)然你也可以為每個(gè)屬性用同樣的方法對(duì)其進(jìn)行賦值和取值的操作,完成在類外部的存取工作。 關(guān)鍵的OOP概念_set() _get() 方法的應(yīng)用 一般來(lái)說,總是把類的屬性定義為private,這更符合現(xiàn)實(shí)的邏輯。但是,對(duì)屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預(yù)定義了兩個(gè)函數(shù)“_get()”和“_set
38、()”來(lái)獲取和賦值其屬性,以及檢查屬性的“_isset()”和刪除屬性的方法“_unset()”。 上一節(jié)中,我們?yōu)槊總€(gè)屬性做了設(shè)置和獲取的方法,在PHP5中給我們提供了專門為屬性設(shè)置值和獲取值的方法,“_set()”和“_get()”這兩個(gè)方法,這兩個(gè)方法不是默認(rèn)存在的,而是我們手工添加到類里面去的,像構(gòu)造方法(_construct()一樣, 類里面添加了才會(huì)存在,可以按下面的方式來(lái)添加這兩個(gè)方法,當(dāng)然也可以按個(gè)人的風(fēng)格來(lái)添加: /_get()方法用來(lái)獲取私有屬性private function _get($property_name)if(isset($this-$property_nam
39、e) return($this-$property_name);else return(NULL);關(guān)鍵的OOP概念/_set()方法用來(lái)設(shè)置私有屬性 private function _set($property_name, $value) $this-$property_name = $value; _get()方法:這個(gè)方法用來(lái)獲取私有成員屬性值的,有一個(gè)參數(shù),參數(shù)傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個(gè)方法不用我們手工的去調(diào)用,因?yàn)槲覀円部梢园堰@個(gè)方法做成私有的方法,是在直接獲取私有屬性的時(shí)候?qū)ο笞詣?dòng)調(diào)用的。因?yàn)樗接袑傩砸呀?jīng)被封裝上了,是不能直接獲取值的(比如:“echo
40、$p1-name”這樣直接獲取是錯(cuò)誤的),但是如果你在類里面加上了這個(gè)方法,在使用“echo $p1-name”這樣的語(yǔ)句直接獲取值的時(shí)候就會(huì)自動(dòng)調(diào)用_get($property_name)方法,將屬性name傳給參數(shù)$property_name,通過這個(gè)方法的內(nèi)部執(zhí)行,返回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,對(duì)象本身就不會(huì)去自動(dòng)調(diào)用這個(gè)方法。 _set()方法:這個(gè)方法用來(lái)為私有成員屬性設(shè)置值的,有兩個(gè)參數(shù),第一個(gè)參數(shù)為你要為設(shè)置值的屬性名,第二個(gè)參數(shù)是要給屬性設(shè)置的值,沒有返回值。這個(gè)方法同樣不用我們手工去調(diào)用,它也可以做成私有的,是在直接設(shè)置私有屬性值的時(shí)候自動(dòng)調(diào)用的,同
41、樣屬性私有的已經(jīng)被封裝上了,如果沒有_set()這個(gè)方法,是不允許的,比如:$this-name=zhangsan, 這樣會(huì)出錯(cuò),但是如果你在類里面加上了_set($property_name, $value)這個(gè)方法,在直接給私有屬性賦值的時(shí)候,就會(huì)自動(dòng)調(diào)用它,把屬性比如name傳給$property_name, 把要賦的值“zhangsan”傳給$value,通過這個(gè)方法的執(zhí)行,達(dá)到賦值的目的。如果成員屬性不封裝成私有的,對(duì)象本身就不會(huì)去自動(dòng)調(diào)用這個(gè)方法。為了不傳入非法的值,還可以在這個(gè)方法給做一下判斷。代碼如下: 關(guān)鍵的OOP概念?phpclass Person/下面是人的成員屬性, 都
42、是封裝的私有成員private $name; /人的名子private $sex; /人的性別private $age; /人的年齡/_get()方法用來(lái)獲取私有屬性private function _get($property_name)echo 在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)_get()方法;if(isset($this-$property_name) return($this-$property_name);else return(NULL);關(guān)鍵的OOP概念/_set()方法用來(lái)設(shè)置私有屬性 private function _set($property_name, $va
43、lue) echo 在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)_set()方法為私有屬性賦值; $this-$property_name = $value; $p1=new Person(); /直接為私有屬性賦值的操作, 會(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-關(guān)鍵的OOP概念程序執(zhí)行結(jié)果: 在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)_set()方法為
44、私有屬性賦值在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)_set()方法為私有屬性賦值在直接設(shè)置私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)_set()方法為私有屬性賦值在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)_get()方法姓名:張三在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)_get()方法性別:男在直接獲取私有屬性值的時(shí)候,自動(dòng)調(diào)用了這個(gè)_get()方法年齡:20以上代碼如果不加上_get()和_set()方法,程序就會(huì)出錯(cuò),因?yàn)椴荒茉陬惖耐獠坎僮魉接谐蓡T,而上面的代碼是通過自動(dòng)調(diào)用_get()和_set()方法來(lái)幫助我們直接存取封裝的私有成員的。 關(guān)鍵的OOP概念對(duì)象的成員屬性設(shè)置方法總結(jié)方法舉例評(píng)
45、價(jià)1類成員屬性為Pulic通過類引用方式來(lái)設(shè)置數(shù)據(jù)成員 $p1-name=”張三”;2類成員屬性為Private通過自動(dòng)調(diào)用_set()方法 private function _set($property_name, $value) $this-$property_name = $value; $p1-name=張三;3類成員屬性為Private通過構(gòu)造方法傳進(jìn)來(lái)的變量來(lái)賦初始值 function _construct($name) $this-name=$name; $p1=new Person(“張三”);4類成員屬性為Private設(shè)置方法set()來(lái)賦值function setName
46、($name) $this-name=$ name; $p1-setName(“張三”);關(guān)鍵的OOP概念對(duì)象的成員屬性獲取方法總結(jié)方法舉例評(píng)價(jià)1類成員屬性為Pulic通過類引用方式來(lái)獲取數(shù)據(jù)成員 $p1-name;2類成員屬性為Private通過自動(dòng)調(diào)用_get()方法 private function _get($property_name,) return($this-$property_name); $p1-name;3類成員屬性為Private設(shè)置方法 get()來(lái)獲得function getName() return($this-$name); $p1-getName( );關(guān)鍵的
47、OOP概念類繼承繼承在PHP中很容易實(shí)現(xiàn),只要使用extend關(guān)鍵字 Class Employee private $name# Define a setter for the private $name member. function setName($name) if ($name = “” ) echo “Name cannot be blank1”; else $this-name = $name; #Define a getter for the private $name memberFunction getName( ) return “My name is “.$this-n
48、ame.” ; # end Employee class#Define an Executive class that inherits from EmployeeClass Executive extends Employee#Define a method unique to Employee function pillageCompany( ) echo “Im selling company assets to finance my yacht!”; #end Executive class關(guān)鍵的OOP概念類繼承# Creat a new Executive object$exec =
49、 new Executive ();#Call the setName() method,defined in the Employee class$exec-setName(“Richard”);#Call the getName() methodecho $exec-getName();#Call the pillageCompany() method$exec-pillageCompany();Result:My name is Richard.Im selling company assets to finance my yacht!關(guān)鍵的OOP概念訪問的修飾符在PHP5中,同C#,J
50、AVA一樣,導(dǎo)入了public,private,protected三個(gè)等級(jí)的訪問限制,使得類的設(shè)計(jì)者,能夠?qū)傩院头椒ǖ氖褂梅椒ㄟM(jìn)行限定,以下是各種訪問的限制Public:可以自由的在類的內(nèi)外任何地方進(jìn)行參照、變更。Private:只能在類的方法中進(jìn)行參照、變更。Protected:能夠在這個(gè)類以及繼承了這個(gè)類的另一個(gè)類的方法中進(jìn)行參照、變更。另外,在繼承的類中,能夠?qū)懭朐L問指定。關(guān)鍵的OOP概念訪問的修飾符Class Hoge1Private $var1;Protected $var2=B;Protected $var3; Function setLower ( ) $this-var1=a
51、; $this-var2=b; $this-var3=c; Function var1Return $this-var1; Function var2Return $this-var2; Function var2Return $this-var2; 關(guān)鍵的OOP概念訪問的修飾符在這個(gè)類中,帶有$var1、$var2、$var3三個(gè)屬性,其中$var1是private,$var2、$var3是protected.在此處PHP代碼-$hoge = new Hoge1();Echo “var1” .$hoge-var1. “n”;-如果嘗試訪問不允許從外部訪問的private屬性,就會(huì)出現(xiàn)錯(cuò)誤:F
52、atal error: Cannot access private property Person:$ var1;對(duì)于protected 的$var2,$var3也是一樣。關(guān)鍵的OOP概念訪問的修飾符但是因?yàn)?hoge的方法是沒有private和protected的,所以下面的代碼能夠正常運(yùn)行,返回內(nèi)部私有和保護(hù)變量的值。PHP代碼-$hoge-setLower();Echo var1: . $hoge-var1. “n”;Echo var2: . $hoge-var2. “n”;Echo var3: . $hoge-var3. “n”;Result:var1: avar2: bvar3: c
53、關(guān)鍵的OOP概念訪問的修飾符其次,為了能夠看到protected的屬性的狀態(tài),我們?cè)囍鴦?chuàng)造了繼承了Hoge1的類Hoge2.PHP代碼-Class Hoge2 extend Hoge1 Public $var3=3; function d_var1( ) return $this-var1; function d_var2( ) return $this-var2; function d_var3( ) return $this-var3; # end Executive class-關(guān)鍵的OOP概念訪問的修飾符在類Hoge2中,只有$var3被聲明為public。在屬性是protected的
54、情況下,從子類進(jìn)行訪問有何種限制,是由子類的屬性聲明決定的。在Hoge2中,因?yàn)?var3被聲明是public,因此無(wú)論是從何處都可以訪問Hoge2的$var3(實(shí)體是Hoge1的$var3).因?yàn)?var1在Hoge1中是private,因此,在Hoge2子類中Hoge1的$var1不會(huì)被繼承,而在Hoge2中有可能會(huì)做出名為$var1的屬性,因此,必須要明確區(qū)分Hoge1:$var1和Hoge2:$var1.PHP代碼-$hoge = new Hoge2.echo var1: . $hoge-var1 .n; /var1:/ echo var2: . $hoge-var2 .n; /Err
55、orecho var3: . $hoge-var3 .n; /var3:3echo var1: . $hoge-d_var1() .“n”; /var1:echo var2: . $hoge-d_var2() .“n”; /var2:Becho var3: . $hoge-d_var3() .n; /var3:3-$hoge-var1是與Hoge1:var1沒有關(guān)系的變量,因此不會(huì)有任何顯示,因?yàn)関ar2有protected訪問限制,所以如果不通過method就直接訪問$var2,就會(huì)出現(xiàn)致命錯(cuò)誤。 關(guān)鍵的OOP概念訪問的修飾符與上述相同,此處也分為private,public,protected三種。Public:能夠從任何地方調(diào)用Private:只能從這個(gè)類的method內(nèi)調(diào)用Protected:只能從這個(gè)類以及subclass的met
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 水泥定價(jià)協(xié)議書
- 牛奶價(jià)格協(xié)議書
- 建筑服務(wù)保潔合同
- 綠色食品供應(yīng)鏈管理系統(tǒng)開發(fā)與運(yùn)營(yíng)合作協(xié)議
- 平安普惠借款合同
- 鄉(xiāng)村農(nóng)業(yè)現(xiàn)代化推廣協(xié)議
- 車隊(duì)承包維修合同協(xié)議
- 運(yùn)輸企業(yè)雇車合同協(xié)議
- 運(yùn)輸項(xiàng)目合作合同協(xié)議
- 油品設(shè)備協(xié)議書
- 2024年美容師技能競(jìng)賽考試題庫(kù)備賽500題(含答案)
- 在2024年銀行系統(tǒng)基層減負(fù)工作推進(jìn)會(huì)上的匯報(bào)發(fā)言范文
- DB34T 4095-2022 高速公路建設(shè)項(xiàng)目電子源文件同步歸檔指南
- 《李煜詩(shī)詞鑒賞:以〈虞美人〉為例》名師課件1
- 廣鐵招聘機(jī)考題庫(kù)
- 公司外派工作合同協(xié)議書
- 城市道路與開放空間低影響開發(fā)雨水設(shè)施
- 巾幗家政職業(yè)技能競(jìng)賽(家政服務(wù))理論考試題庫(kù)(含答案)
- 電工電子學(xué)智慧樹知到期末考試答案章節(jié)答案2024年湖南大學(xué)
- 建材環(huán)保承諾綠色建筑承諾書
- 七年級(jí)期中考試后家長(zhǎng)會(huì)-圖文課件
評(píng)論
0/150
提交評(píng)論